我在主线程中使用 ::WaitForSingleObject(event, INFINITE)
,在子线程中我使用 ::SetEvent(event)
完成子线程。但它不起作用。我想知道为什么??
等待线程退出的一种标准方法是使用带有线程句柄的WaitForSingleObject
,这样做的可靠性涉及使用_beginthreadex。用于创建线程。
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
}
可以通过CWinThread::m_hThread
成员获取使用AfxBeginThread
创建的线程的句柄。
请注意,在线程退出时同步阻塞可能会首先质疑创建线程的想法。
另外请注意,如果该线程具有 GUI,那么阻塞主线程(尤其是使用 INFINITE
参数)似乎是一个非常糟糕的主意。
编辑:您可以在处理发送的消息时进行阻塞等待。使用 MsgWaitForMultipleObjectsEx
API,将 QS_SENDMESSAGE
作为 dwWakeMask
。请注意,如果这不是您等待的条件,您将不得不检查唤醒条件并再次等待。
我是一名优秀的程序员,十分优秀!