主线程里面使用WaitForSingleObject (WaitForMultipleObjects)须要考虑的状况(转)

下面的代码可以看出什么地方出了问题吗?

线程函数:
web

  DWORD WINAPI ThreadProc(
    
  while   (   !   bTerminate)
    
  {
        
 //  从一个链表中读取信息而且插入到CListCtrl中
        
 //  CListCtrl的句柄是经过线程参数传递进来的 
 
         for (;;)
       
 {
           ReadInfoFromList();
           InsertToCListCtrl();
        }
 

    }
 

}

主线程中使用CreateThread启动线程。

当想终止子线程时,在主线程中:
bTerminate = TRUE;
WaitForSingleObject(threadHandle, INFINITE);
但是,以运行到WaitForSingleObject,子线程就Crash了。

为何呢?

问题缘由:
后来我终于在InsertItem的反汇编中发现了以下的代码
call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
可见,InsertItem是必须借助消息循环来完成任务的。若是咱们在主线程中WaitForSingleObject了,必然致使主线程阻塞,也就致使了消息循环的阻塞,最终致使工做线程Crash掉了*_*

解决方案:
为了解决在主线程中Wait的问题,微软专门设计了一个函数MsgWaitForMultipleObjects,这个函数便可以等待信号(thread,event,mutex等等),也能够等待消息(MSG)。即不论有信号被激发或者有消息到来,此函数均可以返回。呵呵,那么个人解决办法也就出来了。
将上面的WaitForSingleObject用下面的代码替换:函数

while (TRUE)
{

    DWORD result ; 
    MSG msg ; 

    result 
= MsgWaitForMultipleObjects(1&readThreadHandle, 
        FALSE, INFINITE, QS_ALLINPUT); 

    
if (result == (WAIT_OBJECT_0))
    
{
        
break;
    }
 
    
else 
    

        PeekMessage(
&msg, NULL, 00, PM_REMOVE);
        DispatchMessage(
&msg); 
    }
 
}


总结:
若是在工做线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。this

相关文章
相关标签/搜索