方案1)当我单击button1,然后在线程工作时用X关闭表单时,我得到“线程错误:句柄无效”

方案2)当我关闭应用程序而不单击button1时,出现“访问冲突...”

procedure TForm1.Button1Click(Sender: TObject);
begin
  ProccesSupervisor:= TMyThread0.Create(True);
  ProccesSupervisor.FreeOnTerminate:=true;
  ProccesSupervisor.Priority := tpNormal;
  ProccesSupervisor.Resume;
end;

procedure TMyThread0.Execute;
begin
  repeat

    //some code here

  until ProccesSupervisor.terminated=true;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  ProccesSupervisor.Terminate;
  ProccesSupervisor.WaitFor;
end;

最佳答案

FreeOnTerminate = true时切勿引用线程对象。该线程可能已经完成工作并销毁了自己,因此访问它可能并不安全。

OnCloseQuery事件处理程序中,如果尚未单击Button1,则您还将访问未初始化的对象。

如果要控制线程的生存期,请保留FreeOnTerminate = false

在您的OnCloseQuery事件处理程序中,在终止线程之前检查该线程是否已分配,并且还防止Button1 click事件一次启动多个线程。

TMyThread0.Execute()中,访问类的字段和方法时,不得引用特定的线程实例。改写这个:

until Terminated;

10-08 15:52