多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > WebRTC學習之八:函數的異步執行

WebRTC學習之八:函數的異步執行

來源:程序員人生   發布時間:2017-02-21 08:30:08 閱讀次數:4784次

WebRTC在asyncinvoker.h和asyncivoker.cpp中實現了函數的異步履行。asyncinvoker.h的注釋中給出了1個小例子,本文的學習就是從這個例子開始的。但是這個例子和單元測試代碼都只演示了如何讓1個函數在子線程中履行,以下所示。

myclass.h

#include "webrtc/base/asyncinvoker.h"
#include <iostream>
#include <memory>

class MyClass 
{

public:
	MyClass();
	void OneTask(rtc::Thread *thread, int x);

	void AnotherAsyncTask(int x);
	
private:
	std::unique_ptr<rtc::AsyncInvoker> invoker;
};
myclass.cpp
#include "myclass.h"
MyClass::MyClass()
{
	invoker.reset(new rtc::AsyncInvoker());
	std::cout << "Main Thread ID:" << rtc::Thread::Current()->GetId() << std::endl;
}

void MyClass::OneTask(rtc::Thread *thread, int x)
{
	invoker->AsyncInvoke<void>(RTC_FROM_HERE, thread, rtc::Bind(&MyClass::AnotherAsyncTask, (MyClass*)this, x));
}
void MyClass::AnotherAsyncTask(int x)
{
	std::cout << "Worker Thread ID:" << rtc::Thread::Current()->GetId() << std::endl;
	std::cout << "Input Value Is:" << x << std::endl;
}
main.cpp

#include "myclass.h"
int main()
{
	std::unique_ptr<rtc::Thread> myThread = rtc::Thread::Create();
	myThread->Start();
	MyClass *myClass = new MyClass;
	myClass->OneTask(myThread.get(), 10);

	Sleep(10000);

    return 0;
}

打印結果

從上圖輸出的線程ID可以看出,函數AnotherAsyncTask是在子線程中履行的。

但是如何在子線程中調用1個函數,并讓該函數中主線程中履行呢,可以將上述代碼稍作更改,以下所示。

myclass.h

#include "webrtc/base/asyncinvoker.h"
#include <iostream>
#include <memory>

class MyClass 
{

public:
	MyClass();
	void OneTask(rtc::Thread *thread, int x);

	void AnotherAsyncTask(int x);
	
	void myFunction(int x);
	
private:
	std::unique_ptr<rtc::AsyncInvoker> invoker;
	rtc::Thread *mainThread;
};
myclass.cpp

#include "myclass.h"
MyClass::MyClass()
{
	invoker.reset(new rtc::AsyncInvoker());
	std::cout << "Main Thread ID:" << rtc::Thread::Current()->GetId() << std::endl;
	mainThread = rtc::Thread::Current();
}

void MyClass::OneTask(rtc::Thread *thread, int x)
{
	invoker->AsyncInvoke<void>(RTC_FROM_HERE, thread, rtc::Bind(&MyClass::AnotherAsyncTask, (MyClass*)this, x));
}
void MyClass::AnotherAsyncTask(int x)
{
	std::cout << "Worker Thread ID:" << rtc::Thread::Current()->GetId() << std::endl;
	std::cout << "Input Value Is:" << x << std::endl;

	invoker->AsyncInvoke<void>(RTC_FROM_HERE, mainThread, rtc::Bind(&MyClass::myFunction, (MyClass*)this, x));
}

void MyClass::myFunction(int x)
{
	std::cout << "myFunction Thread ID:" << rtc::Thread::Current()->GetId() << std::endl;
	std::cout << "myFunction Value Is:" << x << std::endl;
}
main.cpp

#include "myclass.h"
int main()
{
	std::unique_ptr<rtc::Thread> myThread = rtc::Thread::Create();
	myThread->Start();
	MyClass *myClass = new MyClass;
	myClass->OneTask(myThread.get(), 10);
	
	Sleep(10000);

    return 0;
}
函數AnotherAsyncTask中的invoker->AsyncInvoke<void>(RTC_FROM_HERE, mainThread, rtc::Bind(&MyClass::myFunction, (MyClass*)this, x));是想在mainThread中履行myFunction,但是myFunction并未履行,打印結果仍然和上圖相同。

這里需要將main.cpp稍作修改,添加代碼實現線程的消息循環,新的main.cpp以下所示。

#include "myclass.h"
int main()
{
	std::unique_ptr<rtc::Thread> myThread = rtc::Thread::Create();
	myThread->Start();
	MyClass *myClass = new MyClass;
	myClass->OneTask(myThread.get(), 10);
	
	while (true)
	{
		rtc::Thread::Current()->ProcessMessages(0);
		rtc::Thread::Current()->SleepMs(1);
	}

    return 0;
}
打印結果以下圖所示。

從上圖輸出的線程ID可以看出,函數myFunction是在主線程中履行的。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲福利视频一区二区 | www.国产.com| 欧美区国产区 | 女人18毛片a| 三级视频在线看 | www色网站| 久久国产综合精品欧美 | 亚洲 自拍 欧美 综合 | 久久久久久久久久久9精品视频 | 成人淫片 | 欧美a级黄色片 | 精品国产人成在线 | 美女网站在线观看视频免费的 | 欧美一级视频免费观看 | 手机福利在线 | 亚洲精品不卡在线 | 日本特黄色大片 | 欧美日韩一二三区 | 日韩亚洲国产综合久久久 | 欧美午夜精品久久久久免费视 | 国产一区二区三区视频在线观看 | 日本成年一区久久综合 | 欧美日本一区二区 | 免费一级做a爰片久久毛片潮喷 | 巨大黑人极品videos精品 | 图片区小说区号综合区 | 国产肥老妇 | 日韩欧美第一区二区三区 | 国产精久久一区二区三区 | 全国男人的天堂网站 | 日本综合在线 | 在线欧美一区 | 精品一区二区乱码久久乱码 | 欧美极度另类精品 | 成人亚洲欧美日韩中文字幕 | 国产第1页 | 国产dvd毛片在线视频 | 国产欧美久久久另类精品 | 国产日韩精品视频一区二区三区 | 亚洲另类图区 | 国产色啪午夜免费福利视频 |