方案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;