libjingle线程机制

    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;

}

 

 

 

 

 

你可能感兴趣的:(lib)