C++ 如何在MFC中停止主线程和等待子线程

C++ 如何在MFC中停止主线程和等待子线程,c++,visual-c++,mfc,C++,Visual C++,Mfc,我在主线程中使用::WaitForSingleObject(event,INFINITE),在子线程中,我在完成子线程时使用::SetEvent(event)。但它不起作用。我想知道为什么???等待线程退出的一种标准方法是对线程句柄使用WaitForSingleObject,这样做的可靠性涉及到创建线程的使用 HANDLE hThread = reinterpret_cast<HANDLE>( _beginthreadex( ... ) ); if ( hThread ) {

我在主线程中使用
::WaitForSingleObject(event,INFINITE)
,在子线程中,我在完成子线程时使用
::SetEvent(event)
。但它不起作用。我想知道为什么???

等待线程退出的一种标准方法是对线程句柄使用
WaitForSingleObject
,这样做的可靠性涉及到创建线程的使用

HANDLE hThread = reinterpret_cast<HANDLE>( _beginthreadex( ... ) );
if ( hThread ) {
   DWORD dwRet = WaitForSingleObject( hThread, INIFINITE );
   if ( dwRet == WAIT_OBJECT_0 ) {
      // OK
   } else {
      // Error
   }
   CloseHandle( hThread );
} else {
   // Error
}
handlehthread=reinterpret_cast(_beginthreadex(…);
if(hThread){
DWORD dwRet=WaitForSingleObject(hThread,INIFINITE);
if(dwRet==等待对象0){
//嗯
}否则{
//错误
}
CloseHandle(hThread);
}否则{
//错误
}
使用
AfxBeginThread
创建的线程的句柄可以通过
CWinThread::m_hThread
成员获得

请不要担心线程出口上的同步阻塞可能会对首先创建线程的想法产生疑问

还请注意,如果主线程具有GUI,那么阻塞主线程(尤其是使用
无限
参数)似乎是一个非常糟糕的主意

编辑:您可以在处理发送的消息时执行阻止等待。将
MsgWaitForMultipleObjectsEx
API与
QS_sendmages
as
dwawakemask
一起使用。请注意,如果您等待的不是唤醒条件,您必须再次检查唤醒条件并等待。

我发现了我的问题。
当主线程备用时,在子线程中我调用消息并发送给主线程。这似乎是僵局。

我也不知道。这取决于事件的具体内容、设置时间(以及是否自动重置)。诸如此类,没有更多的上下文…感谢您的修改,当我调试它时,请永远在::Waitforsingleobject(事件,不定式)中等待。这取决于相关代码。您是如何创建活动的?是否确实调用了SetEvent(或者它挂起,等待来自主线程的消息)?您确定要在同一对象上同步吗?如果Waitforsingleobject未返回,则不会通知事件。请提供更多的上下文/信息/源代码。谢谢Adriano和manuell。我发现了我的问题,谢谢。但在我的例子中,它挂起WaitingForSingleObject(hThread,INFINITE);你知道吗?如果Waitforsingleobject没有返回,那么你传递的句柄就没有信号。请提供更多上下文/信息/源代码。