主线程使用WaitForSingleObject和MsgWaitForMultipleObjects等待线程返回值

1407 篇文章 2 订阅
1010 篇文章 11 订阅
多线程中,一般主线程创建线程(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 = MsgWaitForMultipleObject s(1,&hEventOk,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;
}
}

2、使用WaitForSingleObject设置最大超时次数,同时处理消息。(可行)
DWORD dwRet = 0;
MSG msg;
int nCount =0;
while (TRUE)  
{
if (nCount>MAXPMSG)//最大次数(宏定义)
{
//超时
break;
}

dwRet = WaitForSingleObject(hEventOk,10);  
switch(dwRet)  
{  
case WAIT_OBJECT_0: //有信号
break; //break the loop  
case WAIT_TIMEOUT:
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);//转发消息
nCount++;
continue;  
default:  
break; // unexpected failure 
}  
break;  
}

3、把要处理的任务全部用线程处理,由线程等待每个任务是否成功。主线程只需要调用一下工作线程,然后将界面暂时BeginWaitCursor,当工作线程完成任务后,发消息告诉主线程,在自定义的消息中判断是否成功还是失败再EndWaitCursor吧。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值