libjingle包裝了所有的線程,包括signaling thread,worker thread, 和其它任何線程,用talk_base::Thread來包裝。所有的 Thread對象由ThreadManager來管理 ,ThreadManager可以在線程內任意地方調CurrentThread()用來獲取線程指針。
Thread對象繼承了MessageQueue實現了類似於windows窗口消息機制,Thread提供了Get、Peek、Post、PostDelayed等一系列消息操作的接口。一個對象想通過MessageQueue接收消息必須繼承並實現MessageHandler。MessageHandler定義了OnMessage方法,這個方法在MessageQueue消息中調用。
有兩種創建線程的方法
1.AutoThread 用libjingle的Thread對象包裝的操作系統線程,並使它成為ThreadManager對象的線程池中的當前線程,(也就是說,當用Thread::CurrentThread調用時返回引線程)
2.Thread 典型用為worker thread,必須創建一個Thread 對象,調用ThreadManager::Add或者ThreadManager::SetCurrent來將它加入池,並調用Run來開始它的循環代碼,或者Start來開始線程監聽。
你可以向任何線程的任何對象發送消息,只要這個對象繼承了talk_base::MessageHandler簡單的示例如下:
class Test:public talk_base::MessageHandler { public: Test() {i=0;} void OnMessage(talk_base::Message *pmsg) { if (pmsg->message_id==50) { talk_base::Thread * curThread=talk_base::Thread::Current(); printf("thread run count=%d threadId=%d\n",++i,curThread->GetThreadId()); } } int i; }; int _tmain(int argc, _TCHAR* argv[]) { talk_base::Thread thread; thread.Start(); Test test; for (int i=0;i<100;++i) { Sleep(30); thread.Post(&test,i); } getchar(); return 0; }