我使用 AfxBeginThread
生成一个线程,它只是一个无限循环:
UINT CMyClass::ThreadProc( LPVOID param )
{
while (TRUE)
{
// do stuff
}
return 1;
}
如何在我的类析构函数中终止这个线程?
我觉得有点像
UINT CMyClass::ThreadProc( LPVOID param )
{
while (m_bKillThread)
{
// do stuff
}
return 1;
}
然后在析构函数中将m_bKillThread
设置为FALSE
。但是我仍然需要在析构函数中等待,直到线程死掉。
最佳答案
主动杀死线程:
使用 AfxBeginThread
的返回值 (CWinThread*
) 获取线程句柄 (m_hThread
) 然后将该句柄传递给 TerminateThread Win32应用程序接口(interface)。不过,这不是终止线程的安全方法,因此请继续阅读。
等待线程完成:
使用AfxBeginThread
(CWinThread*
)的返回值获取成员m_hThread,然后使用WaitForSingleObject(p->m_hThread, INFINITE);
如果此函数返回 WAIT_OBJECT_0
,则线程结束。除了 INFINITE
之外,您还可以设置超时发生前等待的毫秒数。在这种情况下,将返回 WAIT_TIMEOUT
。
向您的线程发出结束信号:
在执行 WaitForSingleObject
之前,只需设置线程应该退出的某种标志。然后在线程的主循环中,您将检查该 bool 值并打破无限循环。在您的析构函数中,您可以设置此标志,然后执行 WaitForSingleObject
。
更好的方法:
如果你需要更多的控制,你可以使用像boost conditions这样的东西.
关于c++ - 如何杀死 MFC 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590792/