现在的位置: 首页 > 综合 > 正文

对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决

2012年01月18日 ⁄ 综合 ⁄ 共 1006字 ⁄ 字号 评论关闭

原文来自:http://blog.csdn.net/silvervi/article/details/5874212

红色字为博主添加:

问题描述:AfxBeginThread创建一个线程后,在线程中操作UI的控件,例如EDIT。在UI的button里停止线程,并等待结束,一般用WaitforsingleObject,但是这个函数会导致UI消息阻塞,如果这个时候线程里正好操作UI控件并需要用到SendMessage,则线程在等待消息发送完,WaitforsingleObject在等待线程,而WaitforsingleObject又阻塞了消息,这样就导致了死循环。下文为解决方法,已经省略,全部可以参考原文地址:

还可以看出:MsgWaitForMultipleObjects实际上在这其中并没有起到什么实质性的作用,只是定期返回而已,那么根据此,可以用固定时间的WaitForSingleObject来代替MsgWaitForMultipleObjects,并且循环等待 ;同时,我们也没有必要手动DispatchMessage,只需要PeekMessage即可,需要注意的是如果删除了DispatchMessage,PeekMessage时不能将消息从队列取走。代码如下:


    DWORD dwRet = 0;  
    MSG msg;  
    while (TRUE)  
    {  
      dwRet = WaitForSingleObject(m_hThread, 50);  
      switch(dwRet)  
      {  
      case WAIT_OBJECT_0:   
        break; //break the loop  
      case WAIT_TIMEOUT :  
        PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);  
        continue;  
      default:  
        break; // unexpected failure  
      }  
      break;  
    }  

      经过测试,代码运行正确!


      当然,由于MsgWaitForMultipleObjects是基于消息驱动的返回,WaitForSingleObject只是普通的定时返回,而本文的情况就是由于消息阻塞造成的,所以MsgWaitForMultipleObjects比WaitForSingleObject在应用时时效性更好,如果改成WaitForSingleObject,在测试中感觉会有略为滞后,所以实际还是以MsgWaitForMultipleObjects为佳。

抱歉!评论已关闭.