程序如下:我用一个全局变量StopThread来终止线程,可是有时候能终止,有时就停在WaitForSingleObject这一句不动了,为什么?volatile bool StopThread;//开始线程
CAAADlg::OnStart()
{
StopThread = false;
AfxBeginThread(Thread1,....);
}//终止线程
CAAADlg::OnStop()
{
StopThread = true;
WaitForSingleObject(....);
}// 线程程序:
UINT Thread1(...)
{
While(1)
{
if (StopThread) break; } return 0;
}
CAAADlg::OnStart()
{
StopThread = false;
AfxBeginThread(Thread1,....);
}//终止线程
CAAADlg::OnStop()
{
StopThread = true;
WaitForSingleObject(....);
}// 线程程序:
UINT Thread1(...)
{
While(1)
{
if (StopThread) break; } return 0;
}
if (WM_THREAD_EXIT == msg.message)
{
StopThread = true;
WaitForSingleObject(....);
}
各位大虾能讲解一下吗?
运行时提示:WM_THREAD_EXIT没有定义
* 退出线程 *
*******************************************************************************/
DWORD m_ThreadID; //线程ID
HANDLE m_hThread; //线程句柄
int ExitThread()
{
if (TerminateThread(m_hThread, 4))
{
DWORD dwExitCode =0;
while(TRUE)
{
GetExitCodeThread(m_hThread, &dwExitCode);
if (dwExitCode != STILL_ACTIVE)
break;
Sleep(10);
}
CloseHandle(m_hThread);
} return 0;
}
CWinThread *pThread;void Start()
{
StopThread = false; pThread = AfxBeginThread(MyControllingFunction,
NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;
VERIFY(pThread->ResumeThread() != (DWORD)-1);
}void Stop()
{
StopThread = true;
WaitForSingleObject(pThread->m_hThread, INFINITE);
delete pThread;
}我的代码是这样的, 我分析可能是在某些情况下程序执行完StopThread = true后线程切换到Thread1, 并且没有来得及执行WaitForSingleObject(...), 线程就结束了运行, 而你又设置得是让框架自动删除执行完成得线程对象, 这时pThread->m_hThread取出来得就是一个垃圾值, 如果这个垃圾值是一个合法得Handle值, WaitForSingleObject(...)就可能死掉.希望我分析得是对得
,但程序稍后会自动出现错误提示:
Unhandle exception in aaa.exe: 0x0C0000005: Access Violation。
如果不执行delete pThread则不会出该提示,这是否说明线程并没有停掉?请继续关注。
PeekMessage(&msg,0,0,0,PM_REMOVE);
if (WM_THREAD_EXIT == msg.message)
{
StopThread = true;
WaitForSingleObject(....);
}
Unhandle exception in aaa.exe: 0x0C0000005: Access Violation
能够说明线程没有停掉.