您好在我的表单中,我在运行时创建 TFrame。在这一帧中,我创建了后台线程,并在无限循环中执行命令。但是当我销毁这个框架时,我应该销毁这个线程。我试试
thread.Suspend;
thread.Terminate;
FreeAndNil(thread);
但得到 AV 和 ThreadError。我应该如何销毁线程?
您好在我的表单中,我在运行时创建 TFrame。在这一帧中,我创建了后台线程,并在无限循环中执行命令。但是当我销毁这个框架时,我应该销毁这个线程。我试试
thread.Suspend;
thread.Terminate;
FreeAndNil(thread);
但得到 AV 和 ThreadError。我应该如何销毁线程?
您必须确保线程退出其Execute
方法以正确终止它。
代码可能是这样的:
procedure TThread.Execute;
begin
while not Self.Terminated do
begin
//do something
end;
end;
当你想销毁线程时调用它:
thread.Terminate;
thread.WaitFor;
FreeAndNil(thread);
这样做就足够了thread.Terminate
。但是您可能希望在thread.FreeOnTerminate := true
创建它时进行设置。
当然,在你的线程的紧循环中(即 in Execute
),你需要检查线程是否被请求终止(检查Terminated
属性)。如果您发现线程已被请求终止,只需从循环中中断并从Execute
.
您永远不应该在 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;