c++ - 从 QThread 类监控 Qt GUI

标签 c++ qt qthread

我正在尝试运行一个后台线程 (qthread),它需要在 gui 中监视一个复选框,但它不会运行!它构建但在运行时我收到此错误:

“program.exe 中 0x0120f494 处的未处理异常:0xC0000005:访问冲突读取位置 0xcdcdce55。”

它在“连接”行中断。执行此操作的最佳方法是什么?

guiclass::guiclass(){
    thread *t = new thread();
}

thread::thread(){
     guiclass *c = new guiclass();
     connect(c->checkBox, SIGNAL(stateChanged(int)), this, SLOT(checked(int)));

     ....
     start work
     ....
}

bool thread::checked(int c){
     return(c==0);
}

void thread::run(){

    if(checked()){
        do stuff
    }
}

最佳答案

任何QThread 对象的事件队列实际上是由启动它的线程处理的,这是很不直观的。常见的解决方案是创建一个“处理程序”对象(派生自 QObject),通过调用 moveToThread 将其与您的工作线程相关联,然后将复选框信号绑定(bind)到一个插槽这个对象的。

代码看起来像这样:

class ObjectThatMonitorsCheckbox : public QObject
{
     Q_OBJECT
     // ...

public slots:
     void checkboxChecked(int checked);
}

在创建线程的代码中:

QThread myWorkerThread;

ObjectThatMonitorsCheckbox myHandlerObject;

myHandlerObject.moveToThread(&myworkerThread);
connect(c->checkBox, SIGNAL(stateChanged(int)), &myHandlerObject, 
    SLOT(checkboxChecked(int)));

myWorkerThread.start();

一个关键点:不要将 QThread 子类化——所有实际工作都在您的处理程序对象中完成。

希望这对您有所帮助!

另请参阅:Qt: Correct way to post events to a QThread?

关于c++ - 从 QThread 类监控 Qt GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284959/

相关文章:

c - 如何制作 Qt 线程包装器

c++ - 从信号到槽的连接返回 false

python - 如何杀死正在进行的请求请求对象

c++ - 如何在 Qt QImage 中使用颜色 LUT

c++ - QThread::currentThread () 与 QObject::thread()

c++ - 在 Qt 中,当线程结束时对象会发生什么?

c++ - 如何使用迭代器在列表中导航? (C++)

c++ - 包含的循环类依赖

java - 类将自身作为参数传递

C++ 封装技术