【问题标题】:Does a thread terminate automatically if its main process is forcefully ended?如果线程的主进程被强制结束,线程会自动终止吗?
【发布时间】:2012-01-12 11:49:07
【问题描述】:

我需要知道,在 Delphi 7 中使用线程 (TThread) 时,如果我强行终止该进程,该线程是 terminated 还是会继续运行?

我的执行过程如下所示,如果线程被终止,那么它将停止。但是如果线程从未被正式终止呢?

procedure TJDApplicationThread.Execute;
var
  ST: Integer;
begin
  ST:= 5;
  fStop:= False;
  while (not Terminated) and (not fStop) do begin
    //----- BEGIN -----

    Synchronize(DoSync);

    //-----  END  -----
    //Sleep(1000 * ST);
  end;
end;

【问题讨论】:

  • (我从线程执行中排除了所有不相关的功能)
  • 问题在下面回答,主要问题是如果Terminated 从未设置为true,我只是害怕这个东西会卡住运行。
  • 当你杀死进程时,进程拥有的所有东西,包括线程也会被杀死。 Terminated 属性无关紧要。系统只会杀死一切。无话可问。现在,更大的问题是你为什么要杀死进程。最好让他们关闭。
  • 好吧,我不是进程杀手,但有时进程是如此顽固,我别无选择,只能杀死它们。
  • 事实上,这还包括在调试应用程序的过程中使用“程序重置”。

标签: multithreading delphi process delphi-7 destructor


【解决方案1】:

因为在用户模式下,线程不能在没有附加进程的情况下存在,线程将自动终止。但是,如果该线程正在执行无法立即中断的操作(例如某些 I/O 操作),则进程可能会延迟完全终止

【讨论】:

  • 所以不管怎样,只要该线程中发生的事情在某一时刻结束,Terminated 属性最终会为真,对吗?
  • 不一定...想想上面的代码是如何运行的。您的主程序也在一个线程上运行,如果该线程在您的子线程之前死亡,那么主线程将没有时间更新该属性。
  • 我明白了,但是当进程被杀死时,线程最终会结束吗?
  • @Jerry, Terminated 属性是从不同的线程设置的,以向工作线程发出它应该终止的信号。然后由工作线程通过检查 Execute 过程中的 Terminated 标志来遵守信号。 Execute 过程完成后,自动设置 Thread 的 Finished 属性。
  • 我所说的“进程完全终止可能会有延迟”的意思是,并非所有线程在每种情况下都会立即被杀死。
【解决方案2】:

设置终止不会自动终止线程。

Terminated 属性是从不同的线程设置的,以向工作线程发出它应该终止的信号。然后由工作线程通过检查 Execute 过程中的 Terminated 标志来遵守信号。

Execute 过程完成后,自动设置线程的 Finished 属性。

当主进程被杀死时,你的线程将被中断并被强行杀死。如果结束,你的意思是,它会到达 Execute 过程的结尾,那么不会。它可能会停在中间。

在主窗体的关闭查询中,礼貌地设置线程的 Terminated 属性并等待它们“完成”。您可以遍历它们并检查。但是在一个很好的超时之后,你可能想放弃并关闭程序,这将中断并杀死线程。

【讨论】:

    【解决方案3】:

    如果用户正在关闭计算机并且线程正在运行,则“终止”也可以(应该)用于 Windows 关闭消息进程。 Terminate 应该在线程处理中的安全点调用。关闭数据集等。

    【讨论】:

    • 好点,这是在关闭/重新启动时停止线程的快速方法。
    猜你喜欢
    • 2011-02-03
    • 2021-09-05
    • 2015-06-24
    • 2021-03-10
    • 2014-08-04
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多