c ++线程活着?

时间:2012-03-01 09:25:02

标签: c++ multithreading winapi

如何?

我尝试了WaitingForSingleObject,GetExitCodeThread等,但是当我使用进程资源管理器杀死线程时没有任何反应。

while(true)
{
    if(GetThreadId(this->hWatchThread) == 0) // Always return killed thread id!
        break;
}

UPD: 当我杀死线程时,它停止工作,但我无法从GetThreadId

获得退出代码或零值

2 个答案:

答案 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);