Sigslot WebRTC中的事件處理機制

2021-07-17 02:32:28 字數 1673 閱讀 3242

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命令執行之前...