C++ 从QThread类监视Qt GUI

C++ 从QThread类监视Qt GUI,c++,qt,qthread,C++,Qt,Qthread,我正在尝试运行需要监视gui中复选框的后台线程(qthread),但它不会运行!它会生成,但在运行时我遇到以下错误: “program.exe中0x0120f494处的未处理异常:0xC0000005:访问冲突读取位置0xcdcdce55。” 它在“连接”线上断开。最好的方法是什么 guiclass::guiclass(){ thread *t = new thread(); } thread::thread(){ guiclass *c = new guiclass();

我正在尝试运行需要监视gui中复选框的后台线程(qthread),但它不会运行!它会生成,但在运行时我遇到以下错误:

“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
——所有实际工作都在处理程序对象中完成

希望这有帮助


另请参见:

您在哪里初始化
c->checkBox
?您如何处理
new guiclass
调用
new thread
调用
new guiclass
调用
new thread
调用
new guiclass
调用
new thread
调用
new guiclass
这一事实?显然,我不是在处理线程之间相互调用,看起来像是我的问题。那么,如何在不创建guiclass对象的情况下监视guiclass呢?