正确的线程破坏

时间:2010-09-24 15:45:18

标签: multithreading delphi destroy

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

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

但获取AV和ThreadError。 我应该如何销毁线程?

3 个答案:

答案 0 :(得分:13)

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

代码可能是这样的:

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

当你想破坏线程时调用它:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

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

在Delphi 2010中,引入了暂停和恢复折旧和方法开始以加强这一点。

有关更完整的说明,请参阅Codegears论坛上的thread

说过有两种方法我会终止并释放一条线程。

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;