2012-11-03 88 views
4

我有一個被稱爲myObject的QObject的子類,它有一個QTimer數據成員在構造函數的堆中分配。 myObject還有一個連接到構造函數中的QTimer timeout()信號的插槽。我將myObject的指針稱爲myObject_ptr。QTimer超時信號不在不同線程上運行時調用槽

我想在與主線程不同的線程上運行myObject。遵循相對較新的建議,我不會繼承QThread。在主線程,我使用myObject的如下:

QThread *thread = new QThread(this); 
myObject_ptr->moveToThread(thread); 
connect(myObject_ptr, SIGNAL(destroyed(), thread, SLOT(quit())); //thread not needed if no object 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); //to avoid memory leak 
connect(thread, SIGNAL(terminated()), thread, SLOT(deleteLater())); //to avoid memory leak 
thread->start(); 

主線程調用myObject_ptr的函數這又啓動QTimer數據成員。當它超時時,什麼也沒有發生,但我期望調用定時器的timeout()信號所連接的myObject槽。問題是什麼?你如何做這項工作。如果myObject在創建它的同一個線程(即主線程)上運行,它將完美地工作。

從我所做的所有閱讀中,我認爲我創建的新線程可能不會處理事件,因爲它沒有自己的事件循環。我還閱讀了與之相反的文檔/文章,說當線程啓動時,run()函數調用exec()並且你有一個事件循環。

有人可以幫我嗎?

我可能會讓它工作正常,如果我繼承QThread,但基於目前的建議,我寧願避免這樣做。

預先感謝您。

回答

3

我解決了我的問題!在爲MyObject的構造函數,定時器在堆上分配如下:

timer_ptr = new QTimer(this); 

但正常工作,它應該是:

timer_ptr = new QTimer(0); 

,並在析構函數,手動刪除對象:

timer_ptr->deleteLater(); 

時,他們說無法與母公司將對象移動到一個線程我想,他們真的意味着所有對象,包括實際上被轉移到新的線程對象的數據成員。

快樂編碼。

+4

我幾乎和你一樣的代碼,但這並沒有解決我的問題。 –

相關問題