在delphi中如何判断线程终止

来源:互联网 发布:手机淘宝怎么看差评 编辑:程序博客网 时间:2024/04/30 08:15

能不能判断线程的状态,是运行,还是挂起呀?怎样得知线程结束了?
我做了一个线程队列,用队列管理线程,可是无法得知哪个线程是否结束了,然后让结束了的线程重新启动?
Obj: TQueryThread
用delphi的TThread类实现
用什么方法可知线程结束了,我用线程句柄,有的线程结束了,但句柄不是0
请问用什么方法判断线程结束了?然后重启结束的线程

楼上的一些方法都说了,我多说一点

根据WIN32平台内核对象的一些原则

线程在仍然活动时,内核对象处于未通知状态,线程中止时,处于通知状态,所以可以根据线程句柄配合等待函数来做

给你写了一个例子:随手写的代码,仅用来演示,实际使用时要注意一些细节。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TTestThread=class(tthread)//被测试线程,仅仅是将窗体的caption从0变到10000
protected
procedure Execute;override;
end;
TmThread = class(tthread)//检测线程,当被侧线程中止时,显示一个对话款
protected
procedure Execute;override;
end;

var
Form1: TForm1;
t : TTestThread;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
t := TTestThread.Create(false);
TmThread.Create(false);
end;

{ TTestThread }

procedure TTestThread.Execute;
var
i : integer;
begin
FreeOnTerminate := true;
for i := 0 to 10000 do
Form1.Caption := Format('%d',[i]);

end;

{ TmThread }

procedure TmThread.Execute;
begin
if WaitForSingleObject(t.Handle,INFINITE)=WAIT_OBJECT_0 then
ShowMessage('线程已经中止');

end;

end.  

delphi 线程作了封装哦, 不但可以在 windows 平台下跑, 也能在 linux 下跑的, 好的代码不要去用 API, TThread 本身封装了些属性, 这样装了 crossKyrix 后, 可以直接编译成 linux 运行文件

property Suspended 暂停
property Terminated 中止
function WaitFor 阻塞等线程结束, 代替 WaitForSingleObject, 返回结果是相同的

看到前面提到 FreeOnTerminate 应小注意一下, 这种线程是不受控的, 一般是那种暂态的, 做完后不需去了解状态的线程, FreeOnTerminate = true 时, 线程属性是不应该去访问的,在建立时设什么就是什么, 因为线程随时可能被释放, 因此极难作收集管理用

原创粉丝点击