webrtc在asyncinvoker.h和asyncivoker.cpp中實現了函式的非同步執行。asyncinvoker.h的注釋中給出了乙個小例子,本文的學習就是從這個例子開始的。但是這個例子和單元測試**都只演示了如何讓乙個函式在子執行緒中執行,如下所示。
myclass.h
[cpp]view plain
copy
#include "webrtc/base/asyncinvoker.h"
#include
#include
class
myclass
;
myclass.cpp
[cpp]view plain
copy
#include "myclass.h"
myclass::myclass()
void
myclass::onetask(rtc::thread *
thread
, int
x)
void
myclass::anotherasynctask(
intx)
main.cpp
[cpp]view plain
copy
#include "myclass.h"
intmain()
列印結果
從上圖輸出的執行緒id可以看出,函式anotherasynctask是在子執行緒中執行的。
但是如何在子執行緒中呼叫乙個函式,並讓該函式中主線程中執行呢,可以將上述**稍作更改,如下所示。
myclass.h
[cpp]view plain
copy
#include "webrtc/base/asyncinvoker.h"
#include
#include
class
myclass
;
myclass.cpp
[cpp]view plain
copy
#include "myclass.h"
myclass::myclass()
void
myclass::onetask(rtc::thread *
thread
, int
x)
void
myclass::anotherasynctask(
intx)
void
myclass::myfunction(
intx)
main.cpp
[cpp]view plain
copy
#include "myclass.h"
intmain()
函式anotherasynctask中的invoker->asyncinvoke(rtc_from_here, mainthread, rtc::bind(&myclass::myfunction, (myclass*)this, x));是想在mainthread中執行myfunction,但是myfunction並未執行,列印結果依然和上圖相同。
這裡需要將main.cpp稍作修改,新增**實現執行緒的訊息迴圈,新的main.cpp如下所示。
[cpp]view plain
copy
#include "myclass.h"
intmain()
return
0;
}
列印結果如下圖所示。
從上圖輸出的執行緒id可以看出,函式myfunction是在主線程中執行的。
WebRTC學習之ICE深入理解
ice 互動式連線建立 interactive connectivity establishment 是一種標準穿透協議。它利用stun和turn伺服器來幫助端點建立連線。下圖顯示了ice的基本步驟 其中傳輸位址是ip位址和埠號的組合。1.收集候選傳輸位址 2.在信令通道中交換候選項 3.執行連線檢...
WebRTC學習之ICE深入理解
ice 互動式連線建立 interactive connectivity establishment 是一種標準穿透協議。它利用stun和turn伺服器來幫助端點建立連線。下圖顯示了ice的基本步驟 其中傳輸位址是ip位址和埠號的組合。1.收集候選傳輸位址 2.在信令通道中交換候選項 3.執行連線檢...
WebRTC學習之ICE深入理解
為了確保nat對映和過濾規則不在回話期間超時,ice會不斷通過使用中的候選項對傳送連線進行檢查。這樣的話,可以確保,即使 暫停或因其他情況沒有傳送,也會有資料報得到持續傳送。ice重啟 因為ip位址是用來生成正在使用的候選項對的傳輸位址。所以無論哪一端的ice檢測到傳輸基位址發生改變,都會觸發ice...