我生成一个线程,使用AfxBeginThread
它只是一个无限的while循环:
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 API.这不是一种终止线程的安全方法,所以请继续阅读.
等待线程完成:
使用返回值AfxBeginThread
(CWinThread*
)来获取成员m_hThread,然后使用WaitForSingleObject(p->m_hThread, INFINITE);
如果此函数返回WAIT_OBJECT_0
,则线程结束.而不是INFINITE
你也可以在超时发生之前等待毫秒数.在这种情况下WAIT_TIMEOUT
将返回.
向您的线程发信号通知它应该结束:
在做之前,WaitForSingleObject
设置一些线程应该退出的标志.然后在线程的主循环中,您将检查该bool值并打破无限循环.在析构函数中,您将设置此标志然后执行WaitForSingleObject
.
更好的方法:
如果您需要更多控制,您可以使用类似增强条件的东西.
顺便说一句,关于TerminateThread(),以这种方式使用。
DWORD exit_code= NULL; if (thread != NULL) { GetExitCodeThread(thread->m_hThread, &exit_code); if(exit_code == STILL_ACTIVE) { ::TerminateThread(thread->m_hThread, 0); CloseHandle(thread->m_hThread); } thread->m_hThread = NULL; thread = NULL; }