Multithreading 正确的线程破坏

Multithreading 正确的线程破坏,multithreading,delphi,destroy,Multithreading,Delphi,Destroy,你好 在我的表单中,我在运行时创建TFrame。在这一帧中,我创建了一个后台线程,它以无休止的循环执行命令。但当我破坏这个框架时,我应该破坏这个线程。 我试着 但是得到AV和ThreadError。 如何销毁线程?执行线程就足够了。终止。但您可能希望在创建时将thread.FreeOnTerminate:=true 当然,在线程的紧密循环中(即在Execute中),您需要检查线程是否已被请求终止(检查Terminated属性)。如果发现线程已被请求终止,只需从循环中断并退出Execute即可。您

你好 在我的表单中,我在运行时创建TFrame。在这一帧中,我创建了一个后台线程,它以无休止的循环执行命令。但当我破坏这个框架时,我应该破坏这个线程。 我试着

但是得到AV和ThreadError。
如何销毁线程?

执行
线程就足够了。终止
。但您可能希望在创建时将
thread.FreeOnTerminate:=true


当然,在线程的紧密循环中(即在
Execute
中),您需要检查线程是否已被请求终止(检查
Terminated
属性)。如果发现线程已被请求终止,只需从循环中断并退出
Execute

即可。您必须确保线程退出其
Execute
方法以正确终止它

代码可以是这样的:

procedure TThread.Execute;
begin
  while not Self.Terminated do
  begin
    //do something
  end;
end;
如果要销毁线程,请调用此命令:

thread.Terminate;
thread.WaitFor;
FreeAndNil(thread);

您不应该在tthread上调用suspend,因为这样做不安全,resume应该只用于启动已创建的挂起线程

在Delphi 2010中,引入了折旧的暂停和恢复以及启动方法来强化这一点

有关更完整的解释,请参见Codegears论坛

说到这里,有两种方法可以终止并释放一个tthread

1:我在创建线程时设置了FreeOnTerminate,所以我只需调用

Thread.Terminate;
2:显式释放线程,因为我需要在释放线程之前和线程终止之后从公共属性读取结果

Thread.Terminate;
Thread.WaitFor;
//Do somthing like read a public property from thread object
if Thread <> nil then FreeAndNil(Thread);

可能重复的不挂起线程。terminate方法只是将Terminated属性设置为true,您的Execute方法负责终止线程。如果挂起,它将没有机会终止。上述代码的另一个问题是,它可能会在更改以正常方式终止之前释放线程。thread.terminate仅将Afterminated属性设置为True。它不会破坏线程,我知道。但每个线程都必须在其Execute方法中检查这一点。我假设OP正在执行此操作。不必从外部调用
Terminate
WaitFor
,因为线程析构函数将自己执行此操作。不过,在释放任何字段之前,可能需要从重写的析构函数调用它,以确保线程不再使用这些字段。
Thread.Terminate;
Thread.WaitFor;
//Do somthing like read a public property from thread object
if Thread <> nil then FreeAndNil(Thread);
procedure TThread.Execute;
begin
  while not Terminated do
  begin
    try
      //do something
    except
      on E:Exception do
       //handle the exception
    end;
  end;
end;