使用 wxWidgets 进行多线程处理时出现奇怪的行为

Strange behavior when multithreading using wxWidgets

本文关键字:wxWidgets 多线程处理 使用      更新时间:2023-10-16

我的应用程序中有 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 << "Donen";
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 {
...

原因是什么?

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