2017-01-10 57 views
2

我已經有了一個更大的項目和架構,並遇到了QT信號時隙系統的情況,信號非常均勻,問題如下:1.不同名稱的不同信號方法如QT有條件的信號發射效率

signals: 
sig_1(bool b); 
sig_2(bool b); 
... 
sig_n(bool b); 

或: 2.冒落的差作爲參數

signal: 
sig(uint n, bool b); 

並讓槽方法決定如果n適合它的內部值

每個選項更糟糕的是,其他:

  1. awefull代碼,我寧願更像是一個通用的解決方案
  2. 每個時隙必須檢查它是否數字將適合,所以每次的O一排(N)連接,當moc已經通過一個開關塊,我們可以達到O(log n)

情況:發射器是一個微控制器的抽象,並獲知輸入變化。許多插槽類只有一個或兩個輸入連接,需要了解其變化。在結構上,發射類不應該依賴於slot-class,因此不應該保留它的監聽器列表或者包含一個公共的超類或監聽器接口,這就是爲什麼我堅持使用信號/時隙系統。

所以我的問題: sig/slot系統或moc中是否存在某種擴展或參數,或者我在這裏完全錯過了某些東西?

+5

如果您使用的是Qt 5和連接使用函數指針的新語法的信號和槽,槽應該被直接調用(不通過'qt_static_metacall會()'和'其之開關) 。 –

回答

0

還有一類Qt中稱爲QSignalMapper,幫助管理多到一個連接,但據我所知它不乙炔發生器解決了許多對許多問題

你可以試着用的想法做掉直接(發射器 - 接收器)連接,並嘗試在中間使用共享數據向量。只發出一個信號(「數據更新」)。接收者將得到關於更新的通知,並且僅從共享數據對象中提取他們需要的數據(如果不擔心線程安全,這可以像地圖一樣簡單)。

如果數據向量小而且複製相對便宜,您可以直接將整個向量/映射直接發送給每個人(如上所述,在Qt5直接連接導致直接函數調用,所以這不會是全部慢)