【PE】判断一个线程是否执行结束的两种方法
2017-11-03 15:29
435 查看
###Date: 2017/11/3
最近在调试多线程的一个线程等待问题,需要判断一个子线程是否执行结束,现在提供两种方法:
关于线程终止的方法可以参考:http://blog.csdn.net/soaringlee_fighting/article/details/78377147
线程结束代码可以调用GetExitCodeThread()(并给予CreateThread所获得的线程handle作为参数)而得知:
hThread:由CreateThread()传回的线程handle
lpExitCode:指向一个DWORD,用于接收结束代码(exit code)
如果成功传回TRUE,否则传回FALSE。如果失败,可以调用GetLastError()找出原因。如果线程已结束,那么线程的结束代码会被放在lpExitCode参数中带回来。如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE。
在调用GetExitCodeThread()之前,要注意不要调用CloseHandle关闭掉线程句柄。GetExitCodeThread()可以在调用WaitForSingleObject()等待线程结束之后调用。
Demo:
参数 hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回 WAIT_OBJECT_0,如果时间超过 dwMilliseconds值但时间事件还是无信号状态则返回 WAIT_TIMEOUT。
WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。
Demo:
参考博客:
http://blog.csdn.net/marcelxx/article/details/10449057 https://q.cnblogs.com/q/29049/
最近在调试多线程的一个线程等待问题,需要判断一个子线程是否执行结束,现在提供两种方法:
关于线程终止的方法可以参考: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/
相关文章推荐
- 判断一个线程是否执行结束以及获取线程退出码
- C语言 判断字符是否是一个数字的两种方法
- C语言编程判断一个数是否为整数的两种常用方法
- [shell]判断一个字符串是否为数字字符串的两种方法(是否为进程号(PID))
- Android 判断当前线程是否是主线程的两种方法
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图
- 用Java判断一个URL是否有效的两种方法
- 判断线程是否结束的方法
- 判断ShellExecute函数是否执行完一个程序的方法
- 判断ShellExecute函数是否执行完一个程序的方法
- 用Java判断一个URL是否有效的两种方法
- 判断ShellExecute函数是否执行完一个程序的方法
- 判断ShellExecute函数是否执行完一个程序的方法
- Android 判断当前线程是否是主线程的两种方法
- 两种方法判断boost线程是否在运行
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
- Java判断线程是否是停止状态的两种方法
- 用Java判断一个URL是否有效的两种方法
- 判断线程是否结束的方法
- 用Java判断一个URL是否有效的两种方法