当应用程序关闭时,如何正确停止线程?
我这样做:
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,infinite)而不是全部都可以。
为什么如果我使用Thread.freeonterminate:= false,那么WaitFor效果很好?请向我解释我做错了什么。
据我了解,我需要使用“如果已分配”而不是“如果不是Thread1.Finished”,对吗?
最佳答案
设置FreeOnTerminate = True
时,线程对象在终止时会自动释放自身。因此,在终止之后,对该对象的任何进一步调用都是无效的。一旦调用Terminate
,就必须假定该对象不再存在。
如果在启动线程后需要对线程进行进一步的操作,则不要设置FreeOnTerminate
。相反,请在真正使用完后手动释放它。
唯一要使用Assigned
的时间是,如果您期望Thread1
变量为nil
。您曾经分配Thread1 := nil
吗?如果没有,那么您不应该期望它具有那样的值(value)。如您所知,在变量上调用方法时,变量不会突然改变它们的值。但是,如果您设置了FreeOnTerminate
,那么检查Finished
属性也是不正确的,因为它可能已经完成并释放了自身。