在开发的时候,发现线程没有真正的终止,一直在吃CPU,仔细分析,做了个测试程序,发现问题如下
1.从CWinThread派生了自己的CMyThread类,并且,这是一个UI线程(其实这个影响不大,在其他人的文章里也提过,任何线程都能处理消息,只是UI线程会有一个隐藏起来的窗口。)
1.1重载InitInstance函数
BOOL CMyThread::InitInstance()
{
TRACE( "CMyThread::InitInstance\n");
this->Run();
return TRUE;
}
1.2重载ExitInstance函数
int CMyThread::ExitInstance()
{
TRACE("CMyThread::ExitInstance\n");
::Sleep(500);
return CWinThread::ExitInstance();
}
1.3在Dialog的Button事件里启动线程
m_pThread = ::AfxBeginThread( RUNTIME_CLASS(CMyThread ),THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED );
ASSERT ( m_pThread );
m_pThread->m_bAutoDelete = FALSE;
m_pThread->ResumeThread();
1.4在Stop事件中终止线程
m_pThread->PostThreadMessage( WM_QUIT, NULL, NULL );
::WaitForSingleObject( m_pThread->m_hThread, INFINITE );
delete m_pThread;
m_pThread = NULL;
TRACE("______Oh~How hard I reach it\n");
程序运行的调试信息如下:
CMyThread::InitInstance
CMyThread::ExitInstance
问题如下:
个人感觉这应该是属于消息循环处理不当的问题,我曾试过不调用Run()进入消息循环(当然也不Post WM_QUIT了),线程是会主动结束的,也就是说,会有以下调试信息输出:
______Oh~How hard I reach it
但是如果使用Run()来处理消息循环,就始终得不到该调试信息。其问题应该是由于线程没有真正结束。线程句柄(m_hThread)没有被激发,所以WaitForSingleObject一直处于等待当中。
于是,真正的问题出来了。我确实向该线程序发送了WM_QUIT消息,并且,Run()也接收到消息,终止了消息循环,进入到ExitInstance函数中了(参看调试输出信息)。这样来说,消息循环应该是终止了才对的。那么,和不调用Run()结束了有区别么,因为已经从Run返回了啊。那么又是什么导致线程没有结束呢?