5

您好在我的表单中,我在运行时创建 TFrame。在这一帧中,我创建了后台线程,并在无限循环中执行命令。但是当我销毁这个框架时,我应该销毁这个线程。我试试

thread.Suspend;
thread.Terminate;
FreeAndNil(thread);

但得到 AV 和 ThreadError。我应该如何销毁线程?

4

3 回答 3

13

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

代码可能是这样的:

procedure TThread.Execute;
begin
  while not Self.Terminated do
  begin
    //do something
  end;
end;

当你想销毁线程时调用它:

thread.Terminate;
thread.WaitFor;
FreeAndNil(thread);
于 2010-09-24T15:56:08.597 回答
4

这样做就足够了thread.Terminate。但是您可能希望在thread.FreeOnTerminate := true创建它时进行设置。

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

于 2010-09-24T15:50:23.157 回答
4

您永远不应该在 tthread 上调用 suspend 这样做是不安全的,并且 resume 应该只用于启动一个创建为挂起的线程。

在 Delphi 2010 中,暂停和恢复贬值以及方法 start 被引入以加强这一点。

有关更完整的解释,请参阅 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);

在主执行循环中,放入一些异常处理可能是个好主意。或者您可能想知道为什么线程似乎终止了它自己。如果线程设置为 FreeOnTerminate 并且在您尝试释放它时它已经被释放,这可能会导致 AV。

procedure TThread.Execute;
begin
  while not Terminated do
  begin
    try
      //do something
    except
      on E:Exception do
       //handle the exception
    end;
  end;
end; 
于 2010-09-26T02:26:47.937 回答