这是我现在使用的一种线程通信方式的代码片段,两个线程之间通过自定义消息进行通知,

#defineMY_MSGWM_USER+100//线程通信的自定义消息
//消费者
DWORDConsumer::Run()

{//创建线程并启动
DWORDThreadId;
m_hThread=CreateThread(NULL,0,Routine,0,0,&ThreadId);//创建更新线程
if(NULL==m_hThread)

{
return-1;//启动失败
}
returnThreadId;//线程启动成功
}
DWORDWINAPIConsumer::Routine(LPVOIDlParam)

{//线程运行函数
std::cout<<"消费者线程启动
/n";
MSGmsg;
PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);
while(true)

{
if(GetMessage(&msg,0,0,0))//getmsgfrommessagequeue

{
switch(msg.message)

{
caseMY_MSG:
//dosomethinghere
std::cout<<"收到消息"<<std::endl;
break;
}
}
};
return0;
}
//生产者
DWORDProducer::Run(LPDEALFUNCTIONdealfun,LPVOIDlParam)

{
DWORDThreadId;
m_DealFun=dealfun;
m_DealFunParam=NULL;
m_hThread=CreateThread(NULL,0,Routine,this,0,&ThreadId);//创建监控线程
if(NULL==m_hThread)

{
return-1;
}
returnThreadId;
}
DWORDWINAPIProducer::Routine(LPVOIDlParam)

{
Producer&obj=*(Producer*)lParam;//生产者对象
while(!obj.m_bRequestStop)

{//线程就不断运行直到收到用户的退出请求
obj.m_DealFun(obj.m_DealFunParam);
}
return0;
}
//main.cpp
HANDLEhStartEvent;//threadstartevent
unsignednConsumerID,nProducerID;
void__stdcallMyDeal(LPVOIDlParam)

{
std::cout<<"开始发送消息.."<<std::endl;
if(!PostThreadMessage(nConsumerID,MY_MSG,NULL,NULL))//postthreadmsg

{
printf("postmessagefailed,errno:%d/n",::GetLastError());
}
::Sleep(1000);
}
intmain()

{
Consumerconsumer;
nConsumerID=consumer.Run();//启动更新线程
if(nConsumerID==-1)

{
std::cout<<"startthreadfailed"<<std::endl;
return-1;
}
ProducerpProducer;
nProducerID=pProducer.Run(&MyDeal,0);//启动监控线程
if(nProducerID==-1)
return-1;
return0;
}
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
692

被折叠的 条评论
为什么被折叠?



