读书人

怎么终止一个线程

发布时间: 2012-03-15 11:50:38 作者: rapoo

如何终止一个线程?
CWinThread* m_Walk=NULL;
if (!m_Walk)
{
m_Walk=AfxBeginThread(m_Manipulator->ThreadWalk,(LPVOID)m_Manipulator);
m_Walk->m_bAutoDelete = FALSE;
m_Walk->ResumeThread();
}

请问如何终止这样的线程?请给出代码!

[解决办法]
老问题了,让线程自己退出,线程外设置信号量,线程内判断是否要退出。
[解决办法]
TerminateThread(m_Walk, 0)
[解决办法]
TerminateThread(m_Walk,0);
CloseHandle(m_Walk);
m_Walk=NULL;
[解决办法]
问msdn吧,呵呵

Parameters

hThread

A handle to the thread to be terminated.

The handle must have the THREAD_TERMINATE access right. For more information, see Thread Security and Access Rights.
dwExitCode

The exit code for the thread. Use the GetExitCodeThread function to retrieve a thread's exit value.

[解决办法]
尽量使线程函数自己退出。
[解决办法]
不知道你是想让线程自己结束还是手动去结束线程。如果是后者,就TerminateThread(),如果是前者在线程里return不就OK了
[解决办法]
大致流程:
SuspendThread(handle);
GetThreadContext(handle, &context);
context->Esp -= 4; // 调整堆栈,模拟压入一个参数
context->Eip = ExitThread; // 下一条指令指向ExitThread
SetThreadContext(handle, context);
ResumeThread(handle); // thread 会自己执行ExitThread(...)
[解决办法]
但是这么做还是并没有真正的结束一个线程的执行,以下给出我的解决方案
DWORD Jade_ThreadByEvent::Kill()
{
DWORD dwKill = 0,dwExitTime = 200;
if(m_hThread != NULL)
{
//检查线程状态
if(JADE_SUCCEEDED(CheckState(TLS_STOP)))
{
Restart();
}
SetEvent(m_hEvent[0]);
dwKill = WaitForSingleObject(m_hWaitEvent[1],INFINITE);
do
{
if(!GetExitCodeThread(m_hThread,&dwKill)||dwExitTime==1000)
{
Abend();//异常非法结束
return GetLastError();
}
Sleep(dwExitTime);
dwExitTime++;
}while(dwKill != m_dwReturn);
CloseHandle(m_hThread);
m_hThread = NULL;
return JADE_OK;
}
return JADE_THREAD_KILLED;
}
[解决办法]
if(m_hThread!=NULL)
{
m_bContinue=FALSE;// 跳出Thread线程的循环
DWORD exitcode;
if(GetExitCodeThread(m_hThread,&exitcode))
{
if(exitcode==STILL_ACTIVE)
{
m_bContinue=FALSE;// 跳出Thread线程的循环
}
}

CloseHandle(m_hThread);
m_hThread=NULL;
}

这个方法能安全退出线程比TerminateThread()要好,防止了无法终止线程的异常情况。

读书人网 >VC/MFC

热点推荐