2017-02-14 479 views
0

假設我們已經從QThread類創建了幾個實例。我需要從一個線程對象發送消息到另一個線程對象,考慮到所有線程對象都是從同一個Qthread類實例化的。通過發出一個信號,所有的線程對象都會收到發出的信號。但我只想要一個特定的對象(例如具有特定線程ID的對象)接收信號。我怎樣才能在Qt中做到這一點?如何向Qt中的QThread類的特定對象發送信號?

謝謝。

+0

聽起來像你從QThread繼承,在這種情況下,我建議你閱讀[本文](https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use -qthreads最全的解釋/)。 QThread更像是一個線程控制器而不是實際的線程,所以除非你想改變Qt管理線程的方式,否則最好不要從QThread繼承。 – TheDarkKnight

回答

2

信號和槽是定義在類,但你特定對象的信號連接到特定對象的插槽。當您在一個線程中發出信號時,只有連接了插槽的對象纔會收到該信號。

+0

是的,我將信號連接到我班的插槽。我的類繼承自QThread類。我需要的是,當我發出一個信號時,我不希望從同一類實例化的所有對象都接收到信號。我想發射信號給特定的物體而不是所有的物體。 –

+1

@ m.taheri您[連接](http://doc.qt.io/qt-4.8/qobject.html#connect)特定的對象,而不是類。只有連接的物體纔會收到信號。否則就不會有任何意義。 – w1ck3dg0ph3r

+0

是的,我把物體連接在一起。但是我需要將信號發送到一組連接對象中的特定對象。 –

1

如果我理解正確的話,你可能需要一個QSignalMapper

該類收集了一組參數的信號,並重新發出他們整數,字符串或對應於發送信號的對象控件參數。

查看示例以獲取更多信息,如果您不喜歡使用信號映射器,則始終可以在插槽中使用自定義過濾器。所以所有其他插槽(對信號不感興趣)都可以忽略它。無法通過emit將信號直接發送到指定的連接插槽來過濾信號。

+0

謝謝@xander,但因爲我的對象是線程,每個線程都有其唯一的標識符,所以我懷疑QSignalMapper對我的目的是否有用。因爲我們應該在創建和刪除線程之前填充地圖。在我的應用程序中,線程的數量不固定,線程被動態地添加和刪除。但我認爲你的第二個提議是有用的,而且是我能做的唯一的事情。非常感謝你。 –

0

信號的發送者不能確定誰接收到信號,並且連接到這樣的信號的每個實例都接收到它。這是信號/時隙機制實現的觀察者模式固有的。

我會做一個介體,派生線程(比如A(1,..,N))註冊自己。在調解器中,你需要實現從A(i)必須去A(j)的消息的邏輯。優點是A實例不需要知道彼此。交互可以通過發佈符合qt的線程安全的事件來完成。