繁体   English   中英

使用wxWidgets多线程时的奇怪行为

[英]Strange behavior when multithreading using 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 ,分别调用了wxNotebookonPageChanged ,其中的指针发生了变化,该指针属于一个尚未创建的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM