c++ - 使用 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 {
...
是什么原因?
解决方案
问题解决了。我一直在寻找一个没有问题的地方。问题是我首先创建了一个wxNotebook
,分别onPageChanged
被调用,其中的指针发生了变化,属于一个尚未创建的类。
推荐阅读
- android - ConstraintLayout(似乎)在 RecyclerView 上使用大量内存(最多 1GB),具体取决于列表中的项目数量
- sql - 固定列上的 SQL Pivot
- bash - 如何重新定位每行的第二个字符串以从同一行的第 n 个字符开始
- python - Python,API 测试:断言失败,但实际和预期似乎相同
- tcl - 如何在 Tcl 中创建列表数组?
- php - Laravel 中使用 put 文件方法的 504 错误
- python - Python 是否对列表的元素进行实习?
- enums - Rust 中的静态枚举
- php - 在php中创建pdf文件然后合并第二个文件
- python-3.x - /Mobile Documents/ 停止“python3 setup.py install”正常工作