如何?
我尝试了WaitingForSingleObject,GetExitCodeThread等,但是当我使用进程资源管理器杀死线程时没有任何反应。
while(true)
{
if(GetThreadId(this->hWatchThread) == 0) // Always return killed thread id!
break;
}
UPD:
当我杀死线程时,它停止工作,但我无法从GetThreadId
答案 0 :(得分:1)
当线程被强行杀死时,例如来自任务管理器或Process Explorer,它不会更改线程ID。线程句柄仍然存在,因为您的进程尚未关闭它。并且与该线程关联的线程ID仍然存在。因此GetThreadId
将始终返回非零值。
对于退出代码,您无法为退出代码获取有意义的值,因为该线程未退出。它被杀了。它从未有机会设置退出代码。
你必须做的是使用其中一个等待函数,例如WaitForSingleObject
,等待你的线程句柄。如果该等待因线程被终止而终止,则wait函数将返回并报告成功等待,并且线程退出代码将报告为0
。据我所知,您无法通过Windows API辨别出您的线程被异常杀死。
您可以使用自己的机制来表明终止是异常的。创建一个由该线程拥有的标志,以记录该终止是正常的。线程开始执行时将标志设置为false。当线程正常终止时,将标志设置为true。通过这种方式,您可以通过在线程终止后读取该标志的值来判断线程是否异常终止。
答案 1 :(得分:0)
如果您想在线程退出后执行某些操作:
WaitForSingleObject(handle_to_your_thread,INFINITE);
MessageBox(NULL,"Thread has exited","Foo",MB_ICONINFORMATION);