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

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

我这样做:

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”,对吧?

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

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

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

转载注明原文:多线程 – 为什么在等待我告诉终止的线程时,“句柄无效”? - 代码日志