为什么在等待我告诉终止的线程时,"句柄无效"?

max*_*fax 6 delphi multithreading terminate

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

我这样做:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not Thread1.Finished
then
  begin
    Thread1.Terminate;
    Thread1.WaitFor();
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但是在Thread1.WaitFor上我有一个错误:"线程错误:句柄无效(6)." 如果我做WaitForSingleObject(Thread1.Handle,无限)而不是WaitFor就可以了.

为什么我使用Thread.freeonterminate:= false然后WaitFor工作正常?请解释我的错误.据我所知,我需要使用"if Assigned"而不是"if not Thread1.Finished",对吧?

Rob*_*edy 11

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

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

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