主线程使用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吧。。。
项目需求:
总共有多条任务要执行,主线程需要需要等待第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吧。。。
相关文章推荐
- 十分钟让你明白Objective-C的语法(和Java、C++的对比
- Inserting a new managed object in Core Data
- swfObject 使用说明
- Object-C中类的属性
- Object-C 数组 字典 集合
- Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Eve
- Proactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous
- Object C学习笔记13-Dictionary
- Objective-C中不同方式实现锁(二)
- SQL中OBJECT_ID,OBJECT_NAME,OBJECT_DEFINITION的用法
- Objective-C中不同方式实现锁(一)
- Effective Object-C 2.0 第一章(条目1和2)
- WaitForSingleObject与waitForMultipleObjects
- iOS学习笔记07—Objective-C 委托、非正式协议、正式协议
- Effective Object-C 2.0
- Property's synthesized getter follows Cocoa naming convention for returning 'owned' objects
- HTML的<object>标签 (转)
- Ajax学习笔记(1)对js的扩展Array,Boolean,Date,Object,String
- object-oriented javascript【简介】
- IOS开发之——objectForKey与valueForKey在NSDictionary中的差异