Multithreading 为什么我会得到;句柄无效";等待线程时,I';你叫我终止吗?

Multithreading 为什么我会得到;句柄无效";等待线程时,I';你叫我终止吗?,multithreading,delphi,terminate,Multithreading,Delphi,Terminate,当应用程序关闭时,如何正确停止线程 我这样做: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if not Thread1.Finished then begin Thread1.Terminate; Thread1.WaitFor(); end; end; 但是在Thread1.WaitFor上我有一个错误:“Thread error:句柄无效(6)。”如果

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

我这样做:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not Thread1.Finished
then
  begin
    Thread1.Terminate;
    Thread1.WaitFor();
  end;
end;
但是在Thread1.WaitFor上我有一个错误:“Thread error:句柄无效(6)。”如果我使用WaitForSingleObject(Thread1.handle,infinite)而不是WaitForAll就可以了

为什么如果我使用Thread.freeonterminate:=false,那么WaitFor工作良好?请解释我做错了什么。
据我所知,我需要使用“if Assigned”而不是“if not Thread1.Finished”,对吗?

当您设置
FreeOnTerminate=True
时,线程对象在终止时自动释放自身。因此,在它终止后,对该对象的任何进一步调用都是无效的。只要调用
Terminate
,就必须假设对象不再存在

如果启动线程后需要对其执行进一步的操作,则不要设置
FreeOnTerminate
。相反,在你真正使用完它之后,手动释放它


只有当您希望
Thread1
变量为
nil
时,才可以使用
Assigned
。您是否分配过
Thread1:=nil
?如果没有,那么您就不应该期望它具有该值。正如您应该知道的,当您对变量调用方法时,它们的值不会突然改变。但是如果您设置了
FreeOnTerminate
,那么检查
Finished
属性也是不正确的,因为它可能已经完成并释放了自己。

Rob,首先我设置了Thread1:=nil。如果一个线程是在一段时间后创建的,我用“Assigned”检查它,如果是,我终止一个线程并释放它。我说的对吗?不,一个对象不跟踪指向它的指针。当对象位于其存在的末尾时,您负责清除指针