从QThread类监视Qt GUI

Monitor Qt GUI from QThread class

本文关键字:Qt GUI 监视 QThread      更新时间:2023-10-16

我正在尝试运行一个后台线程(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对象的事件队列实际上都是由启动它的线程处理的,这是非常不直观的。常见的解决方案是创建一个"handler"对象(从QObject派生),通过调用moveToThread将其与工作线程关联,然后将复选框信号绑定到此对象的插槽。

代码看起来像这样:

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:将事件发布到QThread的正确方式?