首先,您需要以一种方式启动线程,使MFC在线程完成时不会删除线程对象。 MFC线程的默认设置是删除自身,因此您需要关闭它。
m_thread = AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL ,CREATE_SUSPENDED);
m_thread->m_bAutoDelete = FALSE;
m_thread->ResumeThread();
现在在线程中,您需要一种机制,使调用线程可以向其发送信号以结束自身。有多种方法,其中一种是使用
WaitForSingleObject
检查信号的状态,另一种方法是简单地向该线程发送消息以结束自身。这是优雅地结束而不是强制结束。
当此线程正在结束自身(即退出线程函数,清理)时,您可以让主线程等待它完成后再退出。
int wait = 2000
int dwRes = WaitForSingleObject( m_thread->m_hThread, wait);
switch (dwRes)
{
case WAIT_OBJECT_0:
TRACE( _T("worker thread just finished") ); break;
case WAIT_TIMEOUT:
TRACE( _T("timed out, worker thread is still busy") ); break;
}
注意在上面设置
m_bAutoDelete = FALSE
使得当线程结束时我们仍然拥有一个有效的句柄,因此我们可以等待它。现在你不想做的最后一件事是删除 CWinThread 对象以释放其内存(因为我们已经承担了这个责任)。