2013-04-15 41 views
0

所以,我有以下一些示例代碼。使用的QThread沒有新

workerThread = new QThread(); 
m_worker->moveToThread(workerThread); 
connect(workerThread , SIGNAL(started()), m_worker, SLOT(createObject())); 
connect(m_worker, SIGNAL(created()), this, SLOT(objectReceived())); 
workerThread->start(); 

它目前使用QThread通過使用新的初始化它。如果這是唯一的上下文中使用的,不能的話就用「的QThread的WorkerThread」,引用其地址進行連接,並且做些什麼?這可以節省程序將線程放在堆上。我發現,如果我不使用新的,使用我列舉的方式,我得到以下錯誤「的QThread:摧毀,線程仍在運行」。除了我列出的更改外,代碼中沒有任何更改。如果我使用新的,我不會得到這個錯誤。是否有重大差異?

+2

包含此代碼的函數在線程終止之前是否返回? –

+0

顯然你可以做到這一點,這在許多用戶案例中並不理想。如果你不想控制線程生存期,那麼使用堆棧分配。 – dtech

+0

@MartinJames是的。我想那會把我帶到下一個問題:當程序結束時線程被破壞,還是最終泄漏? – edaniels

回答

0

老實說,不會有太多的情況下,你可以把堆棧上的QThread並用它做什麼有用的函數返回(和銷燬線程)前。也許如果你阻塞主線程並等待額外的線程,但是......不知何故,這會破壞使用額外線程的目的。如果你要阻塞主線程來等待額外的線程,那麼你也可以在主線程中做這些工作。

這可能適用的另一種情況是,如果您使用QThread作爲類成員而不是QThread *--在這種情況下,它可以工作,但是您失去了對線程使用壽命的控制,這可能並不理想。如果你有一個更靜態的使用場景 - 你可以做到這一點,並節省動態內存分配的可怕開銷...

無論如何,動態分配單個QThread的開銷可以忽略不計,應該是沒有原因關心。

1

http://qt-project.org/doc/qt-4.8/objecttrees.html

的Qt做更好的清理,如果事情置於堆養育好。

當在堆上創建QObject(即用new創建)時,可以按任意順序構造一棵樹,隨後樹中的對象可以按任意順序銷燬。當樹中的任何QObject被刪除時,如果對象有父對象,析構函數會自動從父對象中刪除對象。如果對象有孩子,那麼析構函數會自動刪除每個孩子。無論銷燬順序如何,QObject都不會被刪除兩次。

然後,文檔繼續說明如果只將它放在堆棧上它可能會失敗。

希望有所幫助。