首页 > 解决方案 > 使用 wxWidgets 进行多线程处理时的奇怪行为

问题描述

我的应用程序中有 2 个线程 - 一个是 UI,第二个是更新一些数据。第二个线程的类继承了wxThread该类,并且有一些变量,特别是Worker *worker.

class Worker {
public:
    virtual void work() {}
};

class WorkerThread : public wxThread {
public:
    bool isRunning = true;
    Worker *worker;

    virtual ExitCode Entry() {
        while (isRunning) {
            if (worker == nullptr) continue;
            worker->work();
            usleep(UPDATE_DELAY_USEC);
        }

        std::cout << "Done\n";

        return 0;
    }
};

如果我将 worker 的值从第一个线程更改为nullptr,应用程序将继续正常工作。例如,如果我将值更改为new Worker()或与原来的值相同,则应用程序将简单地退出。没有任何错误打印到控制台。

wxNotebook我在事件中更改此指针:

void onPageChanged(wxBookCtrlEvent &event) {
    switch (event.GetOldSelection()) {
        case MNP_PROCESSES:
            workerThread->worker = nullptr;
            break;
    }

    switch (event.GetSelection()) {
        case MNP_PROCESSES:
            workerThread->worker = &processes->worker;
            break;
    }
}

整个奇怪的事情是,如果我把它Worker *worker带到全局范围内,那么一切都会正常工作,没有任何错误。

Worker *worker;

class WorkerThread : public wxThread {
    ...

是什么原因?

标签: c++multithreadingwxwidgets

解决方案


问题解决了。我一直在寻找一个没有问题的地方。问题是我首先创建了一个wxNotebook,分别onPageChanged被调用,其中的指针发生了变化,属于一个尚未创建的类。


推荐阅读