想法是这样的,创建线程后,根据需要执行,现场执行完后,不注销,下次还要继续启用执行。
现在的问题是第一次执行后,第二次我不知道怎么调用,我创建的时候是create(true),第一次resume正常执行线程,onterminate事件也正常执行,但是第二次我不清楚用什么方式执行了,还是线程只能一次性的,第二次又需要从新创建?
还有一个问题OnTerminate执行完毕后,线程是处于什么状态,我TForm1.Button2Click(Sender: TObject);时间中调用线程Terminated是False,按直观理解,应该是True啊。请大侠帮忙解答下。{ TMyThread }constructor TMyThread.Create(ASuspended: Boolean);
begin
  inherited Create(ASuspended);
end;procedure TMyThread.Execute;
begin
  inherited;  ShowMessage('3');
end;{ TForm1 }procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(FMyThread) then FMyThread.Destroy;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(FMyThread) then
  begin
    FMyThread := TMyThread.Create(True);
    FMyThread.OnTerminate := ThreadTerminate;    FMyThread.Resume
  end
  else FMyThread.Resume
end;procedure TForm1.ThreadTerminate(Sender: TObject);
begin
  ShowMessage('jieshule');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  if FMyThread.Terminated then ShowMessage('Terminated')
  else ShowMessage('not Terminated');
end;

解决方案 »

  1.   

    procedure TMyThread.Execute;
    begin
      repeat
        // do something
        Suspend;
      until Terminated;
    end;
      

  2.   

    我是用事件+WaitForObject方式实现的,2010还是2007以后,suspend方法已经废弃了,可以参考下我的实现
    http://blog.csdn.net/jankercsdn/article/details/8874469
    关于线程退出处理,还是有不完善的地方,实际使用中有改动,以后整理了再发。
      

  3.   

    改动的: http://blog.csdn.net/jankercsdn/article/details/51323690
      

  4.   

    比较典型的用法。充分利用Delphi封闭的Tthread一、声明一个自己的引用Tthread的类type
      TGaugeThread = class(Tthread)
        protected
          procedure Execute;override;
        end;二、声明一个线程全局变量。一个boolean变量,用于自己控件关闭线程
    var
      MyThread:TGaugeThread;
      ThreadOn:Boolean;三、写一个实现部分
    procedure TGaugeThread.Execute;
    var i: integer;
    begin
      ThreadOn:=True;
      ThreadEnd:=False;
      FreeOnTerminate:=true;
      i:=0;
      repeat
        i:=i+1;
        if i>=99 then i:=1;
        GaugeFrm.Gauge1.Progress:=i;
        application.ProcessMessages;
        sleep(75);
      until Terminated or ThreadEnd;
      GaugeFrm.close;
      ThreadOn:=False;
    end;四、调用线程(可以多次调用)    
    MyThread:=TGaugeThread.Create(False);五、关闭线程
      ThreadEnd:=False
      

  5.   

    在windows上是没有问题的,因为Suspend实际上是API SuspendThread的包装,但是在android上可能没有实现。标注deprecated并非废弃、不能使用,而是代表不赞同使用、过时的意思(因为跨平台的缘故)。
      

  6.   

    你描述的问题其实是有现成的,“线程池”,线程需要不停的从List中取出任务进行执行,没有任务的时候就阻塞在取任务,当然多线程要考虑资源竞争的问题,你可以搜索下 “Delphi 线程池实现”
      

  7.   

    实际上Delphi对TThread的设计就是把Execute过程用Windows的多线程机制运行了一下。所以当Execute过程执行完了,多线程也就结束了。
    所以说,你想让线程一直活着随时让你使用,就不能让Execute结束。那么你在Execute里就需要写一个循环(while/repeat),空闲时Sleep一下防止占用cpu太多,有任务时,设置一下某个变量,Execute里的循环检查到这个变量后继续执行任务(这个任务可以是其他你写好的函数或者过程)。
      

  8.   

    线程就是执行完,自动结束。否则占用CPU,会造成系统阻塞。
      

  9.   

    procedure TMyThread.Execute;
    begin
       while not terminated do
      begin
        DoSomeThing;
        FEvent.WaitFor(INFINITE);
      end;
    end;如果要线程再跑一次, 把FEvent带上信号,FEvent.SetEvent;
      

  10.   

    1. 看情况的,如果线程的起停不是很频繁,那就用的时候创建,不用的时候销毁。
    下面是我写的com口通讯的起停。procedure TAlmDev.Start;
    begin
      try
        FComPort.Open;
        FStop := False;    
      except on e: exception do
        MsgBox(Format('%s: %s', [FComPort.Port, e.message]));
      end;
      //
      if FComPort.Connected and (FComThread = nil) then
      begin
        FComThread := TCommThread.Create(Self);
      end;
    end;procedure TAlmDev.Stop;
    begin
      FStop := True;
      FComPort.Stop;
      //
      if FComThread <> nil then
      begin
        FComThread.Free;
        FComThread := nil;
      end;
      //
      FComPort.Close;
    end;2。如果是起停非常频繁,类似于用在线程缓冲池的时候,就可以用事件,使线程在不用的时候处于阻塞状态,用到时候发送信号给事件,线程就开始循环了。3。还有一种用法比较特殊,就是在外部线程中,调用 suspend 和 resume来起停线程,不过这种方法不常用,主要是起停的时候线程运行状态不太好确定。针对楼主说的已经触发 ontermitate事件,说明线程已经销毁了,不可能在resume了。