您的位置:首页 > 其它

【PE】判断一个线程是否执行结束的两种方法

2017-11-03 15:29 435 查看
###Date: 2017/11/3

    最近在调试多线程的一个线程等待问题,需要判断一个子线程是否执行结束,现在提供两种方法:

关于线程终止的方法可以参考:http://blog.csdn.net/soaringlee_fighting/article/details/78377147

方法一:利用GetExitCodeThread函数实现

    这个函数用于获取线程结束的返回代码。
    线程结束代码可以调用GetExitCodeThread()(并给予CreateThread所获得的线程handle作为参数)而得知:

BOOL GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);


hThread:由CreateThread()传回的线程handle
lpExitCode:指向一个DWORD,用于接收结束代码(exit code)
如果成功传回TRUE,否则传回FALSE。如果失败,可以调用GetLastError()找出原因。如果线程已结束,那么线程的结束代码会被放在lpExitCode参数中带回来。如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE。
在调用GetExitCodeThread()之前,要注意不要调用CloseHandle关闭掉线程句柄。GetExitCodeThread()可以在调用WaitForSingleObject()等待线程结束之后调用。
Demo:
 
LPDWORD exitcode;
if(GetExitCodeThread(h->handle,exitcode))
{
if(STILL_ACTIVE == *exitcode)
{
printf("The thread is still running!");
}
else
{
printf("The thread  is over!");
}
}


方法二:利用WaitForSingleObject函数实现

WaitForSingleObject(
                     HANDLE hHandle, 
                     DWORD dwMilliseconds
                  );

参数 hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回 WAIT_OBJECT_0,如果时间超过 dwMilliseconds值但时间事件还是无信号状态则返回 WAIT_TIMEOUT。
WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。

Demo:

HANDLE g_hThread = NULL;

DWORD ret = WaitForSingleObject(g_hThread, 0);

if(dw == WAIT_TIMEOUT)   //线程正在运行
{
TerminateThread(g_hThread, dwExitCode);   //不建议强制结束

if(g_hThread != NULL)
{
CloseHandle(g_hThread);   //关闭线程句柄,可能线程已结束,但句柄还没释放
g_hThread = NULL;
}
DWORD dwThreadId = 0;//新建一个线程
g_hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &dwThreadId);
}


参考博客:
http://blog.csdn.net/marcelxx/article/details/10449057 https://q.cnblogs.com/q/29049/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐