您的位置:首页 > 移动开发 > Objective-C

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

2014-03-29 13:02 627 查看
多线程中,一般主线程创建线程(CreateThread)后,由工作线程函数完成具体内容,工作线程在返回时通过发消息PostMessage告诉主线程结果,主线程做相当处理。

项目需求:
总共有多条任务要执行,主线程需要需要等待第1条任务执行结果,如果成功就往下执行,失败则重新发3次。这样主线程就需要等待工作线程的结果了。我们采用事件的方式,主线程调用完第一条任务后等待信号(WaitForSingleObject),这样就会出现消息堵塞问题。其结果总是超时。

主线程原代码:
DWORD dwRet = WaitForSingleObject(hEventOk,1000);
if(dwRet==WAIT_TIMEOUT)
//超时处理

解决方法:
1、使用MsgWaitForMultipleObjects代替,理论上可以实现,我在测试时是成功的,到具体项目中永远没有等到信号。。。(也可以使用一个全局的BOOL变量,每次去判断这个变量的状态来检查信号,这样也可以)

BOOL bIsok = TRUE;
while(bIsok)
{
DWORD dwTime = MsgWaitForMultipleObjects(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吧。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: