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

来源:互联网 发布:数据库流程图怎么画 编辑:程序博客网 时间:2024/06/05 06:19

7.3 范例代码2

 

范例代码1是一个单线程的例子,所以并不能够足以研究WebRTC在多线程环境下的工作情况。因此,在这个例子的基础上,我把它改良成了多线程的版本:


[cpp] view plaincopy
  1. #include <string>  
  2. #include <iostream>  
  3. #include "talk/base/thread.h"  
  4.    
  5. class HelpData : publictalk_base::MessageData  
  6. {  
  7. public:  
  8.  std::string info_;  
  9. };  
  10.    
  11. class Police : publictalk_base::MessageHandler  
  12. {  
  13. public:  
  14.  enum {  
  15.    MSG_HELP,  
  16.   };  
  17.    
  18.  void Help(talk_base::Thread& targetThread, const std::string&info) {  
  19.    HelpData* data = new HelpData;  
  20.    data->info_ = info;  
  21.    targetThread.Post(this, MSG_HELP, data);  
  22.   }  
  23.    
  24.  virtual void OnMessage(talk_base::Message* msg) {  
  25.    switch (msg->message_id) {  
  26.    case MSG_HELP:  
  27.       HelpData* data = (HelpData*)msg->pdata;  
  28.      std::cout << "MSG_HELP :" << data->info_<< std::endl;  
  29.      break;  
  30.     }  
  31.   }  
  32. };  
  33.    
  34. int main(int argc, char** argv)  
  35. {  
  36.  std::cout << "Test Multi-thread is started"<<std::endl;  
  37.  Police p;  
  38.  talk_base::Thread thread;  
  39.  thread.Start();  
  40.    
  41.  p.Help(thread"Please help me!");  
  42.  talk_base::Thread::Current()->SleepMs(100);  
  43.  std::cout << "Test Multi-thread is completed" <<std::endl;  
  44.    
  45.  return 0;  
  46. }  

这个版本的代码仅仅就是稍微改装了一点点,但是整个调用栈的情况发生了很大的变化:


 


从上图可以看出,虽然在多线程环境下情况复杂得多,但是WebRTC依然可以保证talk_base::ThreadManager和talk_base::MessageQueueManager这两个全局设施可以在任何子线程启动之前被构造完毕。

 

结合以上2个例子,加上本文对涉及的各个类的解说,我想应该大多数读者能够掌握WebRTC的线程模型的所有细节。如果还有什么疑问的话,那就只能靠动手才能解决问题了。请将以上两个例子编译通过并在你有疑惑的函数中设置log输出,甚至于单步调试你有疑惑的代码,是掌握代码原理的终极手段。
0 0
原创粉丝点击