这是我现在使用的一种线程通信方式的代码片段,两个线程之间通过自定义消息进行通知,
#define
MY_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);
}
int
main()

{
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" />