WebRTC学习之八:函数的异步执行
来源:互联网 发布:eclipse端口号 编辑:程序博客网 时间:2024/06/05 13:28
WebRTC在asyncinvoker.h和asyncivoker.cpp中实现了函数的异步执行。asyncinvoker.h的注释中给出了一个小例子,本文的学习就是从这个例子开始的。但是这个例子和单元测试代码都只演示了如何让一个函数在子线程中执行,如下所示。
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是在子线程中执行的。
但是如何在子线程中调用一个函数,并让该函数中主线程中执行呢,可以将上述代码稍作更改,如下所示。
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是在主线程中执行的。
2 0
- WebRTC学习之八:函数的异步执行
- WebRTC学习之函数的异步执行
- webRTC学习笔记之有用的链接
- webRTC学习笔记之有用的链接
- webRTC学习笔记之有用的链接
- cuda学习笔记之异步并行执行
- cuda学习笔记之异步并行执行
- 学习PB知识总结之八---modify()函数的用法
- 异步函数顺序执行的实现
- WebRTC入门学习之初识WebRTC
- php异步函数执行
- shell学习笔记之八(函数)
- python学习(八)之递归函数
- WebRTC学习的方方面面
- webrtc学习: audio_device之opensles
- WebRTC学习之四:最简单的语音聊天
- WebRTC学习之七:精炼的信号和槽机制
- WebRTC学习之九:摄像头的捕捉和显示
- 系统学习机器学习之神经网络(八) --ADALINE网络
- 关于mac 终端的一些命令
- 调试iLogic Rule
- One or more constraints have not been satisfied.
- ios 计算有行间距的label的高度
- WebRTC学习之八:函数的异步执行
- 用Groovy思考 第二章 Groovy语言的关键特征
- Mac上使用Idea发热严重
- jQuery ajax - serialize() 方法
- leetcode 397. Integer Replacement
- 关于double转string出现科学计数法的问题
- 多进程与多线程的区别与选择(转强力推荐)
- 手把手教你使用Git
- linux基础之completion