2011-06-08 85 views
3

我想运行一个后台线程(qthread),需要监视gui中的复选框,它不会运行!它构建,但在运行时我得到这个错误:从QThread类监视Qt GUI

“程序中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 
    } 
} 
+0

您在初始化'c-> checkBox'的位置?你怎么处理这个事实,即'新的guiclass'调用'新的线程'调用'新的guiclass''调用'新的线程'调用'新的guiclass'调用'新的线程'调用'新的guiclass' ... – Mat 2011-06-08 20:42:16

+0

显然我不是处理相互调用的线程,看起来像我的问题。那么,我将如何监控guiclass而不创建一个guiclass对象? – JonnyCplusplus 2011-06-08 20:47:09

回答

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: Correct way to post events to a QThread?