sigslot 是sarah thompson 設計實現的c++ 事件處理的框架, 這套框架非常輕量級, 全部**只有乙個sigslot.h 檔案, 其設計也非常出色, 最大限度的將事件和處理機制解耦, 並且保證了執行緒安全.
在webrtc中, sigslot 是其基礎的事件處理框架, 在多個模組的訊息通知, 響應處理中被使用. 下文, 我們簡單的來剖析下sigslot 的原理及其應用.
在c++中, 普通的事件處理也容易實現, 下面是乙個簡單的例子, 描述電燈開關工作:
class switch
;class light
;class toggleswitch : public switch
virtual void clicked()
private:
light & m_light;
};// how to toggle light
light red, white;
toggleswitch sw1(red), sw2(white);
sw1.clicked();
sw2.clicked():
上面的**可以工作的很好, 但是有乙個弊端是: toggleswitch 必須得到light的引用, 然後去顯式呼叫light的toggle函式, 這樣的話, swich 和 light 之間是緊耦合. 如果我希望未來switch 可以去控制某個馬達(motor), 將不得不修改**.
有乙個改進的方案是利用c++的多型, 比如設計乙個虛介面: swithableitem, 讓motor 和 light 繼承自這個虛介面. 這也是不錯的思路. 不過在這裡sigslot 利用c++ template, 提供了一種更加優雅的方式, 還是繼續來看**:
class switch
;class light : public sigslot::has_slot<>
; switch sw1, sw2;
light red, white;
sw1.clicked.connect(&red, &light::toggle);
sw2.clicked.connect(&white, &light::toggle);
sw1.clicked();
sw2.clicked();
這段**的功能跟上面的完全一樣, 但是最大的區別在於: switch跟light之間的繫結關係是在執行期建立的, 跟swtich 和 light 本身的設計無關! 這真是令人驚嘆的設計!
下面貼一下webrtc中關於sigslot使用的**片斷:
sigslot::signal2signalframecaptured;class videocapturer : public sigslot::has_slots<>,
public rtc::videosourceinte***ce;
void videocapturer::construct()
void signalcapturedframe(cricket::capturedframe* frame)
reference:
1 sigslot 專案主頁:
Python中的descriptor中的一點疑問
在我的印象中,類中的函式是可以有兩種呼叫方式的,如下 class b def func self return 10 b b b.func b.func b 於是,在之前研究descriptor的時候,我就有了幾點困惑 我將 更換成了如下兩個版本 版本1 import time class lazy...
python中的dict Python中的dict
dict python內建了字典 dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵 值 key value 儲存,具有極快的查詢速度。d print dict get michael d michael add a element d adam 67 print d...
zset中的score Redis中的事務
watch 監控某個或幾個key的變化 multi 接下來的命令不會立馬執行,會先放入乙個事務的佇列中 exec 執行事務佇列中的命令 unwatch 可以在watch執行之後 multi命令執行之前執行,效果是解除對某個key的監控 discard 可以在multi命令執行之後exec命令執行之前...