2014-09-11 87 views
4

將對象從一個線程移動到另一個線程時,moveToThread()是否會自動將現有直接連接重寫爲排隊連接?moveToThread()是否重寫與排隊連接的直接連接?

或者換句話說:如果在moveToThread()的調用之前或之後建立自動連接,它是否重要?

不幸的是,文檔和WWW都沒有在這個問題上的答案。

+0

我檢查了錯誤的部分。我專注於moveToThread()和connect()並錯過了檢查連接類型枚舉文檔,因爲我當然不希望在信號發射時檢查連接類型。 – Silicomancer 2014-09-11 09:29:57

+2

你可以在[源代碼](https://qt.gitorious.org/qt/qtbase/source/9754e5a03e4444a18ec7ca1525d196326ff4e038:src/corelib/kernel/qobject.cpp#L3516)中看到它,如果你有興趣的話。 – thuga 2014-09-11 11:18:02

+1

連接類型*必須*在信號發射時檢查,因爲信號可以從任何地方*發射,線程安全。即使從外國線程。例如,從C庫的回調中發出信號是一種標準慣用語。沒有這樣的發射時間檢查,自動連接類型將是不可能的。雖然* slot *與對象的線程上下文相關聯,但信號不是 - 它僅與發送對象的連接列表關聯。 – 2014-09-11 14:45:04

回答

5

根據Qt documentation:如果接收器駐留在發出信號的線程中,則使用Qt :: DirectConnection。否則,使用Qt :: QueuedConnection。 當信號發射時,連接類型確定爲

+0

地獄,我錯過了那句話!我學到了一些非常重要的東西......我一直認爲建立連接時確定了實際的連接類型。 – Silicomancer 2014-09-11 09:27:43

4

沒有所有直接連接保持直接,所有排隊的連接保持排隊。

但是,自動連接將決定在發射時是否排隊或直接呼叫。因此,相對於moveToThread設置自動連接時無關緊要。