2013-05-08 54 views
0

我剛剛開始在Windows上使用Qt並閱讀有關moveToThread()函數。如果我這樣寫:Qt C++ moveToThread()

class Worker : public QObject 
{ 
    Q_OBJECT 
private: 
    QThread* thread; 
public: 
    void GoToThread() { 
     thread = new QThread(); 
     this->moveToThread(thread); 
    } 
    void DoWork() { 
     //long work 
    } 
}; 

Worker* w = new Worker(); 
w->GoToThread(); 
w->DoWork(); 

這段代碼到底會做什麼?它會把自己放到線程中嗎?我可以在外面打電話給DoWork()嗎?

回答

3

在你給出的例子中,DoWork()將在調用者的線程上執行。

如果你想DoWork()要在Worker對象的線程上完成的,你應該有DoWork()是可以通過發光,它已經連接到或致電QMetaObject::invokeMethod()到的信號來調用插槽「叫」吧。

基本上,將Q_OBJECT移動到另一個線程會使Q_OBJECT使用與該線程關聯的事件隊列,因此通過事件隊列傳遞給該對象的任何事件都將在該線程上處理。

3

這將QObject的移動到新的線程,在什麼邁克爾·伯爾已經說了,因爲你錯過了,你應該看看文檔here在頂部至少一個連接線程完成對deleteLater您的QObject(這會造成內存泄漏)