2010-08-03 67 views
1

我正在研究多線程Qt應用程序,並希望將線程中的信號與另一個線程中的插槽連接起來。我的問題是,我只有用於在項目範圍常量文件中定義的信號線程中設置QObject:objectName的字符串。正在搜索QObject

我的總體目標是避免必須將指針傳遞給其他對象內部多層的對象。過去我一直在做這件事,但它在工作時會增加很多不必要的代碼複雜性。這是一個非常不雅的解決方案。

我想要做的是通過我的應用程序中的所有QObject進行全局搜索,以找到與名稱匹配的那個QObject。在閱讀Qt文檔時,關於如何搜索當前子對象的相當多討論,或者您可以使用父類進行搜索。但對於不同線程中的對象,這似乎不起作用。特別是,由於執行連接的對象不能直接訪問擁有進行信號傳遞的對象的QThread。

有什麼建議嗎?

回答

1

對象樹必須屬於同一個線程。 QObject的詳細說明如下:

使用moveToThread()函數可以更改對象及其子項的線程關聯(如果該對象具有父項,則該對象無法移動)。

我看到一個有趣的解決方案,以找到Qt Creator中實現的對象的問題:它的plugin manager has a global object registry,您可以添加和刪除對象,後來被類型對它們進行查詢。這將很容易擴展它,並允許按名稱查詢。只記得名字不必是唯一的。

+0

非常有趣的鏈接。謝謝! – 2010-08-04 00:28:38

1

你可以寫你自己的名字=>對象圖。 Qt的容器類是線程安全的。

+1

在回顧Qt的文檔時,我發現它們都是可重入的,但是,我沒有看到文檔說容器是線程安全的。就在上個星期,我在一個多線程應用程序中使用QQueue,錯過了一個互斥鎖。我花了一段時間才弄清楚爲什麼我有時會有來自QQueue的垃圾數據。所以根據我的經驗,我不同意Qt容器是線程安全的。 – 2010-08-04 00:37:10