[英]QT Conditional signal emitting - efficiency
我已經准備了一個更大的項目和體系結構,並遇到了QT信號槽系統的情況,該系統的信號非常同質,而且存在以下問題:1.可能有許多不同的信號方法,例如名稱不同
signals:
sig_1(bool b);
sig_2(bool b);
...
sig_n(bool b);
或者:2.發出差異作為參數
signal:
sig(uint n, bool b);
並讓slot方法決定n是否適合其內部值
每個選項比另一個更糟:
這種情況:發射器是微控制器的抽象,並在輸入變化時得到通知。 許多插槽類僅連接一個或兩個輸入,並且需要通知其更改。 從結構上講,發射類不應依賴於插槽類,因此不應保留其偵聽器列表,也不應包含偵聽器的公共超類或接口,因此這就是為什么我堅持使用信號/插槽系統。
所以我的問題是:信號/槽位系統或Moc中是否存在某種擴展名或參數,或者我在這里完全錯過了什么?
Qt中有一個叫做QSignalMapper的類,可以幫助管理多對一連接,但是afaik並不能從數學上解決多對多問題。
您可以嘗試取消直接(發射器-接收器)連接的想法,並嘗試在中間使用共享數據向量。 僅發射一個信號(“數據已更新”)。 接收者將收到有關更新的通知,並僅從共享數據對象中提取所需的數據(如果不考慮線程安全性,這可以像映射一樣簡單)。
如果數據向量較小且復制相對便宜,則可以直接將整個向量/映射直接發送給所有人(如上所述,在Qt5中,直接連接會導致直接函數調用,因此不會太慢)
感謝d.Candela:多對一,多對多的概念對解決問題有一點幫助。 我的問題是缺少一對多。 該解決方案是模板化的管理器類,僅保留一個稀疏條目為1的矩陣。每一行都是輸入值的一部分,並且列以列向量作為訂閱者索引來表示訂閱者。 從這里開始只是移位和屏蔽。 因此,管理器中的模板化矢量取代了監聽器的插槽,並且信號源已連接到管理器。 如果存在對角化矩陣的特殊情況(僅單位訂購向量),我們可以對其進行排序,然后從O(n)降到O(n ^ -2)。
您可以創建一個類來管理所有不同的信號類型,然后在信號中發出該類的對象。 插槽可以檢查發射的對象,以查看是否需要對其進行處理。 示例代碼:
struct SignalInfo {
string description;
bool value1;
int value2;
//Etc
};
那么您的信號簽名將是:
void sig(SignalInfo);
並且您的廣告位可能如下所示:
void Handle_signal(SignalInfo info) {
if (info.description == "type 1") {
/*do something*/
}
}
好處是您可以更改SignalInfo
類,而無需更改其他任何內容。 話雖如此,您可以改為發出和接收對SignalInfo
對象的引用 ,這將使您可以SignalInfo
的子類, SignalInfo
獲得更大的靈活性。 示例信號和插槽簽名為:
void sig(SignalInfo&);
void Handle_signal(SignalInfo& info);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.