当应用程序关闭时,如何正确停止线程?

我这样做:

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属性也是不正确的,因为它可能已经完成并释放了自身。

10-05 21:09