从QThread类监视Qt GUI

3

我正在尝试运行一个后台线程(qthread),需要监视GUI中的复选框,但它无法运行!它可以构建,但在运行时,我收到以下错误:

"Unhandled exception at 0x0120f494 in program.exe: 0xC0000005: Access violation reading location 0xcdcdce55."

并且它会在"connect"行上断开。最好的方法是什么?

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
    }
}

你在哪里初始化 c->checkBox?你如何处理 new guiclass 调用 new threadnew guiclass 调用 new threadnew guiclass 调用 new threadnew guiclass 调用 new thread 的事实? - Mat
显然我没有处理线程相互调用的问题,这似乎是我的问题。那么,我该如何在不创建guiclass对象的情况下监视guiclass呢? - JonnyCplusplus
1个回答

3
任何QThread对象的事件队列实际上是由启动它的线程处理的,这相当不直观。常见的解决方法是创建一个“处理程序”对象(派生自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的正确方法?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接