2010-01-15 36 views
10

我從非Qt線程調用emit signal1()。 非Qt線程我的意思不是來自GUI Event Loop,也不是來自任何QThread run()方法或任何QThread自己的事件循環。從非Qt線程或外部Qt主事件循環中發出Qt信號,並且在4.5

它只是一個調用發出信號的QObject的方法的pthread(pthread_create())。

例如:

MyQbject: public QObject 
{ 
... 
void emitBunchOfSignals() 
{ 
emit signal1(); 
emit signal2(); 
... 
} 
... 
} 

我的並行線程的「運行」方法,它有一個指向MyObject的實例(實例是主要的Qt的圖形用戶界面線程不是上下文並行線程中創建)調用emitBunchOfSignals()方法。

在Qt 4.5之前,這是討厭的。現在,Qt 4.5是如何處理這個問題的? 它是否調用qApp->PostEvent()或其他東西,使信號在Qt GUI線程(以及插槽中)內發射?

感謝

+0

當您調用connect時,您可能會顯式地將類型設置爲排隊連接。 – 2010-01-15 15:46:42

+0

在你寫下這個問題的時候,你可以打開代碼並尋找自己。 – shoosh 2010-01-15 16:00:04

+0

它似乎並沒有像Qt 3.xx一樣崩潰。 我熟悉連接選項(直接連接queuedconnection等),但我認爲它只能在QTreads或QThread和主事件循環之間起作用。爲什麼它曾經與Qt 3.xx一起崩潰,至少通過查看代碼並不是直截了當的理解。我瘋了嗎 ? – 2010-01-15 16:10:27

回答

8

你需要知道什麼是您使用的線程來一個一個排隊的連接,因爲Qt可以不autmatically意義上的對象屬於哪個線程(「線程親和力」是在使用的術語文檔)。連接時你這樣做:

connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection); 

這將導致信號被提上目的地的事件循環,而當它的線程運行(即它的事件循環)被調用的插槽。

+3

非常感謝。 爲了確保我理解你的意思: 由於我發出的QObject不屬於QThread,也不屬於主Qt GUI線程(它實際上屬於我的Corba線程),所以Qt無法感知線程關聯。因此,我必須強制連接到QueuedConnection,因爲在此特定情況下,AutomaticConnection不起作用。 但是,當發射的QObject屬於QThread時,Qt可以感知線程的相關性,並且自動連接將對接收器的QObject線程的Event循環執行必要的後處理。 – 2010-01-18 12:45:04