WebRTC源代码探索之旅——多线程篇(7 - 2)

7.2 范例代码1

 

这里先让我们看一段网上摘录的代码:

 

#include <string>
#include <iostream>
#include "talk/base/thread.h"
 
class HelpData : publictalk_base::MessageData
{
public:
 std::string info_;
};
 
class Police : publictalk_base::MessageHandler
{
public:
 enum {
   MSG_HELP,
  };
 
 void Help(const std::string& info) {
   HelpData* data = new HelpData;
   data->info_ = info;
   talk_base::Thread::Current()->Post(this, MSG_HELP, data);
  }
 
 virtual void OnMessage(talk_base::Message* msg) {
   switch (msg->message_id) {
   case MSG_HELP:
     HelpData* data = (HelpData*)msg->pdata;
     std::cout << "MSG_HELP : " << data->info_<< std::endl;
     break;
    }
  }
};
 
int main(int argc, char** argv)
{
 std::cout << "Test Thread is started"<< std::endl;
 Police p;
 p.Help("Please help me!");
 talk_base::Thread::Current()->Run();
 std::cout << "Test Thread is completed"<<std::endl;
 return 0;
}

这段代码很简单,它演示了单线程环境下如何使用消息处理器。不过这个程序会永久等待在以下语句:

talk_base::Thread::Current()->Run();

不能,正常退出。如果读者感兴趣,可以尝试以下如何使用一条延迟消息,让程序正常退出。

 

接下来,让我们看一下整个WebRTC代码的调用栈展开会是一个生个状况。可能会出乎你的意料,整个调用栈还是比较复杂的:

 

 

从上图可以看到,在调用talk_base::Thread::Current函数之后,整个调用栈涉及到了talk_base::ThreadManager、talk_base::MessageQueue、talk_base::MessageQueueManager三个类,其中talk_base::ThreadManager和talk_base::MessageQueueManager是在其Instance函数被调用后触发构造的全局唯一的对象实例。从这个调用栈可以看出,一旦调用有些talk_base::Thread的成员函数(静态/非静态)就会自动触发构造talk_base::ThreadManager和talk_base::MessageQueueManager,并且把当前线程封装成一个talk_base::Thread实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值