可否用WaitForSingleObject判断线程运行或结束

Soyokaze 2010-07-28 11:46:38
WaitForSingleObject(hThread, 0);

返回 WAIT_TIMEOUT,说明还在运行;
返回 WAIT_OBJECT_0,说明已经结束
这种方法可不可行?
在我的程序里面,用的就是这种方法,但是最近出问题了,明明线程已经结束了,但还是返回WAIT_TIMEOUT
(确实已经结束了,给那个线程调用GetExitCodeThread,返回0)。请问这是怎么回事啊?
...全文
832 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 soyokaze 的回复:]
我想的是零等待判断线程是否结束,而不是死等。
其实可以用一个事件来实现,线程退出时设置事件为有信号,就可以判断已经退出了。
但是我想的是用 WaitForSingleObject()这种直接的方法。
按照MSDN文档,本来是可以的,但是出现了0楼所述的问题,这贴的目的是问这个的。
[/Quote]
你判断线程结束的方法用的是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吧。
wltg2001 2010-07-29
  • 打赏
  • 举报
回复
可以啊,从你的代码中好像看不出什么问题
bragi523 2010-07-29
  • 打赏
  • 举报
回复
觉得不妨在WaitForSingleObject第二个参数稍微加一个数字试试
Soyokaze 2010-07-29
  • 打赏
  • 举报
回复
我想的是零等待判断线程是否结束,而不是死等。
其实可以用一个事件来实现,线程退出时设置事件为有信号,就可以判断已经退出了。
但是我想的是用 WaitForSingleObject()这种直接的方法。
按照MSDN文档,本来是可以的,但是出现了0楼所述的问题,这贴的目的是问这个的。
Soyokaze 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wltg2001 的回复:]

引用 4 楼 fishion 的回复:
WaitForSingleObject(hThread, 0);
If dwMilliseconds is zero, the function tests the object's state and returns immediately
所以用WaitForSingleObject(hThread, INFINITE);

我估计楼主并不想……
[/Quote]
就是这样
magic7004 2010-07-29
  • 打赏
  • 举报
回复
楼主为什么要判断线程是否结束呢?

楼主可以判断线程要做的事情有没有结果就行了,它结束不结束貌似无所谓吧
花花呀123456 2010-07-29
  • 打赏
  • 举报
回复
WaitForSingleObject(hThread, INFINITE);
wltg2001 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fishion 的回复:]
WaitForSingleObject(hThread, 0);
If dwMilliseconds is zero, the function tests the object's state and returns immediately
所以用WaitForSingleObject(hThread, INFINITE);
[/Quote]
我估计楼主并不想等待线程结束,他的目的是判断线程是否结束,而不是想等待它结束。
Eleven 2010-07-29
  • 打赏
  • 举报
回复
WaitForSingleObject(hThread, 0);
-->
WaitForSingleObject(hThread, INFINITE);
ben_jobs 2010-07-29
  • 打赏
  • 举报
回复
GetExitCodeThread返回值为0不一定是错误,可用GetLastError来判断,应该是你线程的返回值,你可以把它改为非0试一下.详情参见MSDN.WaitForSingleObject可以用来等待你线程在退出时设定发出的信号,但直接这样用好像不行.
[Quote=引用楼主 soyokaze 的回复:]
C/C++ code
WaitForSingleObject(hThread, 0);

返回 WAIT_TIMEOUT,说明还在运行;
返回 WAIT_OBJECT_0,说明已经结束
这种方法可不可行?
在我的程序里面,用的就是这种方法,但是最近出问题了,明明线程已经结束了,但还是返回WAIT_TIMEOUT
(确实已经结束了,给那个线程调用GetExitCodeThread,返回0……
[/Quote]
dvlinker 2010-07-29
  • 打赏
  • 举报
回复
确保线程已经退出
dvlinker 2010-07-29
  • 打赏
  • 举报
回复
WaitForSingleObject(hThread, INFINITE);//等待知道线程退出
偶像罗斯福 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fishion 的回复:]
WaitForSingleObject(hThread, 0);
If dwMilliseconds is zero, the function tests the object's state and returns immediately
所以用WaitForSingleObject(hThread, INFINITE);
[/Quote]正解
fishion 2010-07-29
  • 打赏
  • 举报
回复
WaitForSingleObject(hThread, 0);
If dwMilliseconds is zero, the function tests the object's state and returns immediately
所以用WaitForSingleObject(hThread, INFINITE);
Soyokaze 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wltg2001 的回复:]

引用 14 楼 soyokaze 的回复:
我想的是零等待判断线程是否结束,而不是死等。
其实可以用一个事件来实现,线程退出时设置事件为有信号,就可以判断已经退出了。
但是我想的是用 WaitForSingleObject()这种直接的方法。
按照MSDN文档,本来是可以的,但是出现了0楼所述的问题,这贴的目的是问这个的。

你判断线程结束的方法用的是GetExitCodeThrea……
[/Quote]
我程序里是用WaitForSingleObject()判断的,而不是GetExitCodeThread()。
之所以提到了后者,是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没有运行时,返回的正常。
phoenix_zhou 2010-07-29
  • 打赏
  • 举报
回复
GetExitCodeThread() 的返回值应该是 TRUE 或者 FALSE, 尽管 BOOL 实际上是 typedef int BOOL, 即 GetExitCodeThread() 的返回值只表示该函数本身执行是否成功并不是说对应线程如果结束了GetExitCodeThread() 函数就必须返回其结束代码,线程是否结束与该函数的返回值根本就是两码事,GetExitCodeThread() 函数返回 FALSE 的唯一情况应该是它无法确定其检测线程的状态.而候捷这里却以其返回值来判断被检测线程是否结束,并说GetExitCodeThread() 的返回值是一种" 糟糕的行为" ,这很没道理,该函数设计的目的就是获取一个线程结束时的返回值,本来就不是用来检测一个线程是否结束,当然如果能够保证线程不将 STILL_ACTIVE 作为错误码返回也可以用来检测线程是否结束
============================这是网上说的
phoenix_zhou 2010-07-29
  • 打赏
  • 举报
回复
GetExitCodeThread() 将传回线程函数的返回值,然而GetExitCodeThread() 的一个
糟糕行为是,当线程还在进行,尚未有所谓的结束代码时,它会传回TRUE表示成功,如果
这样, lpExitCode 指向的内存区域中应该放的时STILL_ACTIVE,你必须小心这种行为
,也就是说你不可能从其返回值中知道"到底是线程还在运行呢,还是它已经结束,但返回
值为 STILL_ACTIVE"==================这是侯捷翻译的

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧