2009-08-12 59 views

回答

41

這取決於。從documentation

發出信號時,連接到它的插槽通常會立即執行,就像正常的函數調用一樣。發生這種情況時,信號和插槽機制完全獨立於任何GUI事件循環。一旦所有插槽已返回,將會執行emit語句後面的代碼。使用queued connections時情況稍有不同;在這種情況下,emit關鍵字後面的代碼將立即繼續,並且插槽將稍後執行。

因此,在正常情況下,它將是同步和阻塞,並與排隊連接它將是異步和非阻塞。

+10

另請注意,默認情況下:同一線程中對象之間的連接是直接(同步),並且不同線程中對象之間的連接將排隊。如果你認爲這很合乎邏輯。 – quark 2009-08-14 00:42:36

+0

@quark這不完全正確。這些對象是否在同一個線程中並不重要。如果發出信號的線程是接收對象所在的線程,那麼問題很重要.Qt文檔甚至錯誤地解決了這個問題。來源:[線程中的信號和插槽](http://qt-project.org/wiki/Threads_Events_QObjects#913fb94dd61f1a62fc809f8d842c3afa)。我同意Qt的行爲是合乎邏輯的。 – 2013-03-21 17:09:09

9

laalto上面的答案是正確的。還有一點:如果你的所有QObject都屬於同一個線程,並且你沒有手動指定排隊連接,那麼連接到信號的插槽的執行將同步發生 - 所有處理都將在'發射之後的下一行之前完成'聲明。由於這是最常見的情況,所以你的問題的答案通常是'是'。

關於signals and slots across multiple threads的文檔可能對您有所幫助。

25

最大的問題是你只是不知道。也就是說,如果你從課堂的角度來看。當你發射,你不知道會發生什麼:

  • 如果沒有一個連接到信號,沒有任何反應
  • 如果在同一個線程有人在使用任何類型的Qt的除外:: QueuedConnection連接,的通話將被阻止
  • 如果在同一個線程有人使用Qt :: QueuedConnection連接,調用將無阻塞
  • 如果從不同的線程有人使用Qt :: DirectConnection連接(必須非常小心,當你這樣做!)或Qt :: BlockingQueuedConnection,呼叫將被阻止
  • 如果從不同的線程有人使用Qt ::自動連接或Qt的:: QueuedConnection連接,調用將無阻塞

它變得更加難以知道,如果多個對象連接到會發生什麼信號。在這種情況下,有些插槽可能已經運行,而其他插槽仍在排隊。 順便說一句,沒有線程涉及非阻塞連接。只有一個事件被髮送到接收對象的線程的事件循環中。

相關問題