返回> 网站首页 

在主线程中终止带消息处理的线程的方法

yoours2011-03-21 16:29:21 阅读 1148

简介一边听听音乐,一边写写文章。

当线程中有消息处理时,如一般的线程中显示操作结果时,此时如果要在主线程中使用WaitForSingleObject的话,往往会导致阻塞,例如如下的主线程终止副线程,而副线程中用了诸如SendMessage的函数,那么自然相互锁住了,因为你运行等待的函数没有返回,那么线程中的消息得不到处理,自然就两边的线程都阻塞在那里,此时可以使用API函数MsgWaitForMultipleObjects来解决,如下所示。将等待到的消息进行处理。再继续等待,直到超时或等待成功。

  1. // 停止线程, nTime为等待毫秒  
  2. bool CThreadBase::StopThread( UINT nTime )  
  3. {  
  4.     if( NULL == m_pWinThread )  
  5.         return false;  
  6.           
  7.     m_bIsRunning = false;  
  8.       
  9.     DWORD result;  
  10.     MSG msg;  
  11.     HANDLE hHandle = m_pWinThread->m_hThread;  
  12.     whiletrue )  
  13.     {  
  14.         result = MsgWaitForMultipleObjects( 1, &hHandle, FALSE, nTime, QS_ALLINPUT );  
  15.         if( result == WAIT_TIMEOUT )  
  16.         {  
  17.             return false;  
  18.         }  
  19.         else if ( result == ( WAIT_OBJECT_0 ) )  
  20.         {  
  21.             return true;  
  22.         }   
  23.         else   
  24.         {   
  25.             PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );  
  26.             DispatchMessage( &msg );  
  27.             continue;  
  28.         }  
  29.     }  
  30.           
  31.     return true;  
  32. }  

微信小程序扫码登陆

文章评论

1148人参与,0条评论