6

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

我这样做:

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) 而不是 WaitFor 一切都可以。

为什么如果我使用 Thread.freeonterminate := false 那么 WaitFor 效果很好?请解释我做错了什么。据我了解,我需要使用“如果分配”而不是“如果不是 Thread1.Finished”,对吗?

4

1 回答 1

12

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

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

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

于 2011-06-11T03:02:18.487 回答