簡體   English   中英

QT條件信號發射-效率

[英]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是否適合其內部值

每個選項比另一個更糟:

  1. 很棒的代碼,我更喜歡通用解決方案
  2. 每個插槽都必須檢查它的數量是否合適,因此,每隔O(n)個連接,當moc都經過一個交換塊時,我們就可以到達O(log 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM