WaitForSingleObject(hThread, 0); If dwMilliseconds is zero, the function tests the object's state and returns immediately 所以用WaitForSingleObject(hThread, INFINITE);
你判断线程结束的方法用的是GetExitCodeThread,通过它的返回值来判断的,但是MSDN上对GetExitCodeThread的返回值的说法是: Return Values If the function succeeds, the return value is nonzero.If the function fails, the return value is zero GetExitCodeThread返回0只是说明这个函数调用失败,并不是说线程已经退出了。 用GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) 判断线程状态是看它的第二个参数 lpExitCode是不是STILL_ACTIVE吧。
糟糕行为是,当线程还在进行,尚未有所谓的结束代码时,它会传回TRUE表示成功,如果
这样, lpExitCode 指向的内存区域中应该放的时STILL_ACTIVE,你必须小心这种行为
,也就是说你不可能从其返回值中知道"到底是线程还在运行呢,还是它已经结束,但返回
值为 STILL_ACTIVE"==================这是侯捷翻译的
============================这是网上说的
If dwMilliseconds is zero, the function tests the object's state and returns immediately
所以用WaitForSingleObject(hThread, INFINITE);
-->
WaitForSingleObject(hThread, INFINITE);
其实可以用一个事件来实现,线程退出时设置事件为有信号,就可以判断已经退出了。
但是我想的是用 WaitForSingleObject()这种直接的方法。
按照MSDN文档,本来是可以的,但是出现了0楼所述的问题,这贴的目的是问这个的。
Return Values
If the function succeeds, the return value is nonzero.If the function fails, the return value is zero
GetExitCodeThread返回0只是说明这个函数调用失败,并不是说线程已经退出了。
用GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode)
判断线程状态是看它的第二个参数 lpExitCode是不是STILL_ACTIVE吧。
之所以提到了后者,是WaitForSingleObject()出现错误后,用来证明线程确实已经退出了的。
现在不明白是WaitForSingleObject()本身的Bug,还是我程序的问题。
具体是这样的:
3个线程A、X、Y
A是常驻线程,一直在运行
X负责和用户的交互,有一个窗口
当A发现用户交互请求时,启动X
X和用户交互完毕后,反过来把用户的选择通知A(通过PostThreadMessage),然后结束
针对不同的用户选择,某些情况下需要Y来完成响应。所以对于这些选择,A再启动Y
在Y执行过程中,用户仍可以和X交互来选择中止Y
所以当用户提出交互要求时,A需要判断X是否运行,否的话再建立X
-------------------------
问题就出在A判断X上,当X没有运行(不是挂起,是退出)Y运行时,不论怎么调用
WaitForSingleObject(hThread, 0);
返回的都是WAIT_TIMEOUT(应该是WAIT_OBJECT_0);
而Y没有运行时,返回的正常。