2014-04-02 128 views
0

我想知道qt如何決定哪種調度信號的工作方式。qt發射信號如何將信號與併發線程一起工作

http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads 我發現

Auto Connection (default) If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection. Otherwise, the behavior is the same as the Queued Connection.

什麼是在這種情況下,意義affinity

Qt如何知道哪個線程使用對象的方法來防止信號數據損壞? affinity線程是創建對象的線程嗎?

回答

1

除非調用moveToThread,否則每個QObject都綁定到特定線程(可通過thread() function查詢),默認情況下爲創建該對象的那個線程。

每個對象都具有與其父項相同的線程。

+0

的螺紋上的事件:「每個對象與它的父對象具有相同的線程「,這是否意味着在另一個線程中創建子對象會從父對象」繼承「線程」affinity「? – Klaus

+1

您不能在另一個線程上使用對象的父對象。作爲moveToThread狀態的文檔:「這個函數只能將一個對象從當前線程」推送「到另一個線程,它不能將一個對象從任意線程」拉「到當前線程。」 – TheDarkKnight

0

對象的線程關聯是該對象執行的線程。

一個對象從它創建的線程開始,它的線程親和性就是該線程。在其整個生命週期中,它可以移動到不同的線程,這將改變線程的親和力。

發送信號時,Qt會查看發送和接收對象的線程關聯性。如果他們具有相同的親和力(在同一個線程上運行),則建立直接連接。

然而,如果兩個對象具有不同的線程的親和性(在不同的線程中運行),則發送方如果你說宿接收對象,這是使用一個排隊連接