在delphi中如何判断线程终止

necyhk 2006-12-14 08:59:29

能不能判断线程的状态,是运行,还是挂起呀?怎样得知线程结束了?
我做了一个线程队列,用队列管理线程,可是无法得知哪个线程是否结束了,然后让结束了的线程重新启动?
Obj: TQueryThread
用delphi的TThread类实现
用什么方法可知线程结束了,我用线程句柄,有的线程结束了,但句柄不是0
请问用什么方法判断线程结束了?然后重启结束的线程
...全文
1570 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjksoft 2006-12-21
  • 打赏
  • 举报
回复
oushengfen 2006-12-21
  • 打赏
  • 举报
回复
呵呵,学习了不少
comanche 2006-12-15
  • 打赏
  • 举报
回复
delphi 线程作了封装哦, 不但可以在 windows 平台下跑, 也能在 linux 下跑的, 好的代码不要去用 API, TThread 本身封装了些属性, 这样装了 crossKyrix 后, 可以直接编译成 linux 运行文件

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

看到前面提到 FreeOnTerminate 应小注意一下, 这种线程是不受控的, 一般是那种暂态的, 做完后不需去了解状态的线程, FreeOnTerminate = true 时, 线程属性是不应该去访问的,在建立时设什么就是什么, 因为线程随时可能被释放, 因此极难作收集管理用
hangzhou_hammer 2006-12-15
  • 打赏
  • 举报
回复
感谢楼上的 例子~~是我了解了WaitForSingleObject的用法
wudi_1982 2006-12-15
  • 打赏
  • 举报
回复
楼上的一些方法都说了,我多说一点

根据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.
newfang 2006-12-15
  • 打赏
  • 举报
回复
freeonterminate := true;
necyhk 2006-12-15
  • 打赏
  • 举报
回复
我试过了,线程execute过程执行完了,但线程对像还没有释放
chinayk11 2006-12-14
  • 打赏
  • 举报
回复
Assigned(Thread) and not Thread.Terminated //正运行
daviddelphilee 2006-12-14
  • 打赏
  • 举报
回复
OnTerminate
guoyabin2000 2006-12-14
  • 打赏
  • 举报
回复
在线程里自己定义一个变量用来表示线程的运行状态吧
hongqi162 2006-12-14
  • 打赏
  • 举报
回复
任务完成以后就挂起
然后判断时候挂起
Thread.Suspended

线程唤醒
Thread.Resume
lonoaer 2006-12-14
  • 打赏
  • 举报
回复
WaitForMultipleObjects

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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