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

时间:2011-06-11 02:14:19

标签: 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上我有一个错误:“线程错误:句柄无效(6)。”如果我做WaitForSingleObject(Thread1.Handle,无限)而不是WaitFor就可以了。

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

1 个答案:

答案 0 :(得分:11)

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

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

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