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;
}