多线程中,一般主线程创建线程(CreateThread)后,由工作线程函数完成具体内容,工作线程在返回时通过发消息PostMessage告诉主线程结果,主线程做相当处理。
项目需求:
总共有多条任务要执行,主线程需要需要等待第1条任务执行结果,如果成功就往下执行,失败则重新发3次。这样主线程就需要等待工作线程的结果了。我们采用事件的方式,主线程调用完第一条任务后等待信号(WaitForSingleObject),这样就会出现消息堵塞问题。其结果总是超时。
主线程原代码:
DWORD dwRet = WaitForSingleObject(hEventOk,1000);
if(dwRet==WAIT_TIMEOUT)
//超时处理
解决方法:
1、使用MsgWaitForMultipleObject
s代替,理论上可以实现,我在测试时是成功的,到具体项目中永远没有等到信号。。。(也可以使用一个全局的BOOL变量,每次去判断这个变量的状态来检查信号,这样也可以)
BOOL bIsok = TRUE; while(bIsok) { DWORD dwTime = MsgWaitForMultipleObjects(1,&hThread1,FALSE, 10, QS_ALLINPUT); MSG msg; //等到信号 switch(dwTime) { case WAIT_OBJECT_0: { bIsok = FALSE; } break; case WAIT_OBJECT_0+1: { //有消息 if(PeekMessage(&msg,NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } break; case WAIT_TIMEOUT: { //超时处理 } break; } if(bIsok == FALSE) break; }