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

解决方案 »

  1.   

    任务完成以后就挂起
    然后判断时候挂起
    Thread.Suspended线程唤醒
    Thread.Resume
      

  2.   

    Assigned(Thread) and not Thread.Terminated //正运行
      

  3.   

    我试过了,线程execute过程执行完了,但线程对像还没有释放
      

  4.   

    楼上的一些方法都说了,我多说一点根据WIN32平台内核对象的一些原则线程在仍然活动时,内核对象处于未通知状态,线程中止时,处于通知状态,所以可以根据线程句柄配合等待函数来做给你写了一个例子:随手写的代码,仅用来演示,实际使用时要注意一些细节。
    unit Unit1;interfaceuses
      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.
      

  5.   

    感谢楼上的 例子~~是我了解了WaitForSingleObject的用法
      

  6.   

    delphi 线程作了封装哦, 不但可以在 windows 平台下跑, 也能在 linux 下跑的, 好的代码不要去用 API, TThread 本身封装了些属性, 这样装了 crossKyrix 后, 可以直接编译成 linux 运行文件 property Suspended  暂停
    property Terminated 中止
    function WaitFor    阻塞等线程结束, 代替 WaitForSingleObject, 返回结果是相同的看到前面提到 FreeOnTerminate 应小注意一下, 这种线程是不受控的, 一般是那种暂态的, 做完后不需去了解状态的线程, FreeOnTerminate = true 时, 线程属性是不应该去访问的,在建立时设什么就是什么, 因为线程随时可能被释放, 因此极难作收集管理用