如何在应用程序关闭时正确停止线程?
我这样做:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not Thread1.Finished
then
begin
Thread1.Terminate;
Thread1.WaitFor();
end;
end;
但是在Thread1.WaitFor上我有一个错误:“线程错误:句柄无效(6)。”如果我做WaitForSingleObject(Thread1.Handle,无限)而不是WaitFor就可以了。
为什么我使用Thread.freeonterminate:= false然后WaitFor工作正常?请解释我的错误。 据我所知,我需要使用“if Assigned”而不是“if not Thread1.Finished”,对吗?
答案 0 :(得分:11)
设置FreeOnTerminate = True
时,线程对象在终止时自动释放。因此,在它终止后,对该对象的任何进一步调用都是无效的。一旦调用Terminate
,就必须假设该对象不再存在。
如果在启动线程后需要对线程进行进一步操作,则不要设置FreeOnTerminate
。相反,在您真正使用它之后手动释放它。
如果您期望Assigned
变量为Thread1
,则唯一一次使用nil
。你有没有指定Thread1 := nil
?如果没有,那么你不应该期望它具有那个价值。您应该知道,当您调用方法时,变量不会突然改变它们的值。但是如果你设置了FreeOnTerminate
,那么检查Finished
属性也是不正确的,因为它可能已经完成并释放了自己。