TThread子类,如何检查线程是否停止?(50分)

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

WilliamGui

Unregistered / Unconfirmed
GUEST, unregistred user!
TThread子类
用Terminate中止,但线程只是开始停止,并未停止,也不能用以下判断
Terminated属性值也是一样
Finished属性值也是一样
OnTerminate事件也是一样

如何判断?
 
OnTerminate就是终止了。
 
在OnTerminate中检测Terminated的属性值,如果为true那么以经停了。
 
对于TThread子类
如果要等待线程的停止, 我的作法是:
// 要停止线程时, TMyThread实例.WantTerminated := True; 在线程中不时的判断 FWantTerminated 的值, 为 FWantTerminated 则 Exit(or 跳出循环), 等线程执行结束, Terminated 属性的值也就为 True 了.也就是可以用 Terminated(此时是线程自己给 FTerminated 赋的值) 来判断线程是终止!
TMyThread = class(TThread)
private
FWantTerminated: Boolean; // 增加字段, 初始为 False
public
procedure Execute; override;

property WantTerminated: Boolean read FWantTerminated;
end;

procedure Execute;
begin
// ...
// 不时地检查 FWantTerminated 的值是否为 True;
if FWantTerminated then Exit; // 或跳出循环等使线程早给执行完
// ...
end;
 
在需要判断TTread对象是否中止的函数里用GetExitCodeTread根据返回值就能判断是否已经停止。
 
还是不稳定,退出时,有时死
 
Terminate只是通知停止,线程并没有马上停止,停止了如何知道?
GetExitCodeTread并不可靠,网上有文章。
WaitFor经常会死。
如何办?
 
每个类对象都有ONDESTROY方法,TTHREAD子类也不例外。
 
后退
顶部