【问题标题】:when you terminate() a Thread (class TThread), does it exit every child of this thread?当您终止()一个线程(类 TThread)时,它是否退出该线程的每个子线程?
【发布时间】:2013-05-16 20:14:24
【问题描述】:

我在 Delphi 中有一个代码,它执行以下操作:

procedure THilo.Execute; // (which is the thread)
begin
  inherited;
  FreeOnTerminate := True;
  while not Terminated do
  begin
    (...)
    Sleep(100);
  end;
end;

现在在其他地方,在另一个线程(或 GUI)中我们这样做:

var
  Hilo2: THilo;
begin
  Hilo2 := THilo.Create(True);
  Hilo2.start;
  Hilo2 := THilo.Create(True);
  Hilo2.start;
end;

现在我们已经执行了 2 次同一个线程,它们是并行运行的。如果我们现在这样做会发生什么?:

  Hilo2.Terminate;

这会终止两个线程还是仅终止 1 个线程,还是什么? 另外,如果我们想终止它,我们可以通过 .Resume() 来实现吗?

提前致谢

【问题讨论】:

    标签: multithreading delphi terminate resume


    【解决方案1】:

    当您创建第二个线程时,您将使用指向第二个对象的指针覆盖局部变量 Hilo2 - 第一个对象的指针丢失并且您不再拥有对它的任何引用(或控制它的方式)。如果线程没有自行终止,这将导致内存泄漏,不,调用终止不会停止两个线程,只有最后一个使用该变量作为引用创建的线程。此外,无需在 TThread 的 Execute 方法中调用 inherited - 没有可继承的内容(TThread 的 execute 方法是抽象的,它不做任何事情)。

    【讨论】:

    • 谢谢 J,我在我的程序中有这个并且无法终止线程,所以它可以通过一个 TThread 数组来修复,对吧?像` Hilo[i] := THilo.Create(True); Hilo[i].start;`
    • 哦 - 另一个熟练的 Delphi 多线程开发人员。这让我们至少有两个人:)
    • 此外,由于正在使用FreeOnTerminate=True,如果线程过早终止(未捕获的异常等),那么如果线程已经消失,调用Terminate() 可能会失败(或更糟的是,内存损坏) . FreeOnTerminate=True 应该只用于创建和忘记线程。一旦您出于任何原因(暂停/恢复、终止/等待、更新/访问成员等)必须从外部触摸线程,请不要使用FreeOnTerminate=True
    • 另一个问题——如果你打算使用FreeOnTerminate=True,请在构造函数中设置它(或者至少在Resume/Start()ACreateSuspended=True调用之前)。这是因为几年前,TThread 已更新为如果在线程实际开始运行之前调用 Terminate() 则根本不调用 Execute()。如果Execute() 设置FreeOnTerminate=True,则存在内存泄漏风险。
    • @MartinJames 别这么自大了。
    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多