在开发的时候,发现线程没有真正的终止,一直在吃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 =

本文探讨了一个关于CWinThread线程在调用Run()进入消息循环后无法正常终止的问题。作者通过调试发现,线程未结束是由于在InitInstance()中返回TRUE导致系统再次进入消息循环。解决方案是将初始化工作放在InitInstance(),消息循环和其他任务放在重载的Run()中,资源释放和处理放在ExitInstance(),并在InitInstance()中返回TRUE,让系统调用Run()。
最低0.47元/天 解锁文章
2107

被折叠的 条评论
为什么被折叠?



