您好 在我的表单中,我在运行时创建TFrame。在这个框架中,我创建了后台线程,并在无限循环中执行命令。但是当我摧毁这个框架时,我应该摧毁这个线程。 我试试
thread.Suspend;
thread.Terminate;
FreeAndNil(thread);
但获取AV和ThreadError。 我应该如何销毁线程?
答案 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;