MFC使用AfxBeginThread创建线程退出方法:
CWinThread * myThread; //线程
bool isThreadBegin = false; //线程退出/执行控制
//创建线程
void CDlg::OnButtonCreateThread()
{
isThreadBegin = true; //运行线程执行
myThread = AfxBeginThread(MyThreadProc, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
}
//线程函数
UINT _cdecl CDlg::MyThreadProc(LPVOID lpram)
{
...
while(isThreadBegin )
{
...
break;
}
return 0; //线程返回值,线程最好通过返回值退出线程,这样会释放线程所有资源
}
//停止线程
void CDlg::OnButtonStopThread()
{
isThreadBegin = false; //停止线程执行
WaitForSingleObject(myThread->m_hThread, INFINITE); //一直等待线程退出
}
不推荐使用ExitThread,和TerminateThread来退出线程。
如果线程处于挂起状态,且没有被唤醒,使用上述方法结束线程的时候,会出现程序"假死"的现象。因为此时线程被挂起,系统不会给该线程分配时间片运行程序,所以线程不能通过return结束,因此WaitForSingleObject(myThread->m_hThread, INFINITE)一直在等待,造成程序没有反应。故当线程被挂起,而想要结束线程时,需要先唤醒线程。
下面是WaitForSingleObject的使用说明:
DWORD WaitForSingleObject(
HANDLE hObject, //指明一个内核对象的句柄
DWORD dwMilliseconds); //等待时间
该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态(如果内核对象是线程,若线程结束,为通知状态;若线程未结束,为非通知状态),则该函数导致线程进入阻塞状态;如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。
第二个参数指明了需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去;如果第二个参数为0,那么函数就测试同步对象的状态并立即返回;如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。