2011-06-08 108 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?