WebRTC學習之函式的非同步執行

2021-07-31 22:23:20 字數 2071 閱讀 9140

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...