VC++线程通信
這是我現(xiàn)在使用的一種線程通信方式的代碼片段,兩個線程之間通過自定義消息進行通知,
#define?MY_MSG?WM_USER+100?//線程通信的自定義消息
//消費者
DWORD?Consumer::Run()
{//創(chuàng)建線程并啟動
????DWORD?ThreadId;
????m_hThread?=?CreateThread(?NULL,0,Routine,0,0,&ThreadId?);//創(chuàng)建更新線程
????if(?NULL?==?m_hThread?)
????{
????????return?-1;//啟動失敗
????}
????return?ThreadId;//線程啟動成功
}
DWORD?WINAPI?Consumer::Routine(?LPVOID?lParam)
{//線程運行函數(shù)
????std::cout<<"消費者線程啟動\n";
????MSG?msg;
????PeekMessage(&msg,?NULL,?WM_USER,?WM_USER,?PM_NOREMOVE);
????while(true)
????{
????????if(GetMessage(&msg,0,0,0))?//get?msg?from?message?queue
????????{
????????????switch(msg.message)
????????????{
????????????case?MY_MSG:
????????????????//do?something?here
????????????????std::cout<<"收到消息"<<std::endl;
????????????????break;
????????????}
????????}
????};
????return?0;
}
//生產(chǎn)者
DWORD?Producer::Run(LPDEALFUNCTION?dealfun,LPVOID?lParam)
{
????DWORD?ThreadId;
????m_DealFun?=?dealfun;
????m_DealFunParam?=?NULL;
????m_hThread?=?CreateThread(?NULL,0,Routine,this,0,&ThreadId?);//創(chuàng)建監(jiān)控線程
????if(?NULL?==?m_hThread?)
????{
????????return?-1;
????}
????return?ThreadId;
}
DWORD?WINAPI?Producer::Routine(?LPVOID?lParam?)
{?
????Producer&?obj?=?*(Producer*)lParam;//生產(chǎn)者對象
????while(?!obj.m_bRequestStop?)
????{//線程就不斷運行直到收到用戶的退出請求
????????obj.m_DealFun(obj.m_DealFunParam?);
????}
????return?0;
}
//main.cpp
HANDLE?hStartEvent;?//?thread?start?event
unsigned?nConsumerID,nProducerID;
void?__stdcall?MyDeal(?LPVOID?lParam?)
{
????std::cout<<"開始發(fā)送消息.."<<std::endl;
????if(!PostThreadMessage(nConsumerID,MY_MSG,NULL,NULL))//post?thread?msg
????{
????????printf("post?message?failed,errno:%d\n",::GetLastError());
????}
????::Sleep(1000);
}
int?main()
{
????Consumer?consumer;
????nConsumerID?=?consumer.Run();//啟動更新線程
????if(nConsumerID?==?-1)
????{
????????std::cout<<"start?thread?failed"<<std::endl;
????????return?-1;
????}
????Producer?pProducer;
????nProducerID?=?pProducer.Run(&MyDeal,?0?);//啟動監(jiān)控線程
????if(?nProducerID==-1?)
????????return?-1;
????return?0;
}
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
總結(jié)