如何判断自己创建的线程是否运行结束?(100分)

  • 主题发起人 主题发起人 wanggy
  • 开始时间 开始时间
W

wanggy

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个线程ttest, 然后创建了test[1],test[2],test[3],test[4]
如何判断test[2]创建的线程是否运行结束。
 
是不是有IsHandle这个API?
 
wanggy:
HELLO!你可以判断ThreadID是否为0。
 
用一个TList来维护线程
线程结束时向主线程发一个消息,主线程把TList置为nil,我作过这样的东西
 
kindly:
你说:“线程结束时向主线程发一个消息”,但能发消息线程就还没有结束,只是
快结束了。而“快结束了”到真正结束需要多久是难以确定的。
在大多数情况下,“快结束了”也够用。但在一些时候,如程序关闭时,是不够的。
 
使用GetExitCodeThread这个API,如果返回STILL_ACTIVE说明没有释放。
如果你是想在释放之后干什么事情,而必须在全部释放之后,
可以在释放前,调整线程的相对优先级为较高的级别。
 
能不能在快结束的时候发消息给主线程,然后WaitForSingleObject()?
 
同意Jani的看法,另外
可以设置FreeOnTerminate:=True,则线程会自动释放所占用的资源
或者
MyThread.Terminate
WaitForSingleObject()
MyThread.Free.
则可以中途中断线程。

 
可以使用API函数WaitForSingleObject来判别
if ( WaitForSingleObject(test[2].Handle,0)=WAIT_TIMEOUT) then
// 线程退出来了
else
// 线程退没有出来
注意,上述这种方法是不能把test[2]的属性FreeOnTerminate设为TRUE的。
假设FreeOnTerminate设为TRUE,当执行上述语句的时候,若线程test[2]
已经退出来了,也就是test[2]已经被释放了,这时引用test[2]的Handle,
要么会引发一个访问违例,要么得到的Handle是无意义的。
一般说来,若把TThread的FreeOnTerminate属性设为TRUE,是在以下情况:
创建的线程自己肯定能结束,和这个线程和其它线程没有其他瓜葛。若不
满足上述条件,把FreeOnTerminate属性设为TRUE,会带来很多意外的麻烦。
 
to Racer:好像是WAIT_OBJECT_0吧:
if ( WaitForSingleObject(test[2].Handle,0)=WAIT_OBJECT_0) then
// 线程退出来了
else
// 线程退没有出来
 
多人接受答案了。
 
后退
顶部