在MFC中安全的创建并关闭线程
//SomeClass.h
class SomeClass{
public:
SomeClass();
protected:
CWinThread* m_pCoolingThread;
HANDLE m_hCoolingThreadBackup;
HANDLE m_hCoolingThreadShutdownEvent
BOOL m_bCoolingThreadAlive;
static UINT CoolingThread(LPVOID lParam);
BOOL StartCoolingThread(LPVOID lParam);
BOOL KillCoolingThread();
};
//SomeClass.cpp
SomeClass::SomeClass()
{
m_pCoolingThread = NULL;
m_hCoolingThreadBackup = NULL;
m_hCoolingThreadShutdownEvent = NULL;
m_bCoolingThreadAlive = FALSE;
}
BOOL SomeClass::StartCoolingThread(LPVOID lParam)
{
KillCoolingThread();
//创建线程结束事件,你也可以用其他方式结束线程
m_hCoolingThreadShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
try{
m_pCoolingThread = AfxBeginThread(CoolingThread, lParam, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if(!m_CoolingThread){
throw CString(_T("Can/'t begin CoolingThread"));
}
::DuplicateHandle(GetCurrentProcess(), m_pCoolingThread->m_hThread,
GetCurrentProcess(), &m_hCoolingThreadBackup , 0,
FALSE,
DUPLICATE_SAME_ACCESS);
m_pCoolingThread->ResumeThread();
}
catch(CString str){
AfxMessageBox(str);
return FALSE;
}
return TRUE;
}
BOOL SomeClass::KillCoolingThread(LPVOID lParam)
{
if(m_bCoolingThreadAlive && m_hCoolingThreadShutdownEvent && m_hCoolingThreadBackup){
DWORD dwExitCode = 0;
//设置线程结束事件为有信号,或其他结束线程的方式
SetEvent(m_hCoolingThreadShutdownEvent);
do{
::GetExitCodeThread(m_hCoolingThreadBackup, &dwExitCode);
//设置线程结束事件为有信号,或其他结束线程的方式
SetEvent(m_hCoolingThreadShutdownEvent);
Sleep(20);
}while(ExitCode == STILL_ACTIVE);
m_hCoolingThreadBackup = NULL;
CloseHandle( m_hCoolingThreadShutdownEvent);
m_hCoolingThreadShutdownEvent = NULL;
}
return TRUE;
}
UINT SomeClass::CoolingThread(LPVOID lParam)
{
CSafeThreadDlg* pIns = (CSafeThreadDlg*)lParam;
pIns->m_bCoolingThreadAlive = TRUE;
while(1)
{
/** ...you code ... */
DWORD dwEvent = ::WaitForSingleObject(pIns->m_hCoolingThreadShutdownEvent, 1);
if(dwEvent == WAIT_OBJECT_0) {
break;
}
}
pIns->m_bCoolingThreadAlive = FALSE;
return 0L;
}