multithreading - Delphi 当应用程序在线程等待事件时终止时会发生什么?

标签 multithreading delphi events

我有一个线程,它循环执行工作并通过事件休眠一段时间(几秒钟)。当线程休眠等待事件时,用户可以终止应用程序。在这种情况下,事件实际上会发生什么?线程是否会一直运行直到事件超时,从而延迟应用程序的完全终止?还是立即返回,并返回超时以外的返回值?

最佳答案

虽然启动比创建它们的 Delphi 应用程序生命周期更长的进程并非不可能,但以通常方式(通过 TThread.Create)创建和启动的线程在主线程结束后立即结束,而无需等待周期完成并且不会阻止主应用程序的终止。

要让自己相信这一点,请创建一个 Delphi 应用程序和一个通过单击按钮启动的线程。让线程写入文件,然后休眠任意长的时间。当您确定它处于 sleep 状态时,请关闭该应用程序。请注意,应用程序会立即终止,并且线程也会“在 sleep 中被杀死”。

事实上,如果我们添加一个终结部分:

type
  TTThread = class(TThread)
       msg : string;
       ctr : Integer;
    public procedure Execute; override;
    procedure Update;
  end;

procedure TTThread.Execute;
var F: TextFile;
begin
  ctr := 0;
  assignFile(F, 'log.txt');
  rewrite(f);
  closefile(f);
  while not Terminated do
  begin
      inc(ctr);
      msg := 'Updating';
      Synchronize(Update);
      assignFile(F, 'log.txt');
      append(f);
      writeln(F, IntToStr(Ctr));
      closefile(f);
      msg := 'Sleeping';
      Synchronize(Update);
      Sleep(3000);
  end;
end;

procedure TTThread.Update;
begin
   Form1.Caption := '**********'+msg+IntToStr(ctr)+'******************';
end;

var T: TTThread;
procedure TForm1.Button1Click(Sender: TObject);
begin
   if not assigned(T) then T := TTThread.Create(false);
end;


var F: TextFile;
initialization
finalization
      assignFile(F, 'log.txt');
      append(f);
      writeln(F, 'Application out!');
      closefile(f);
end.

(注意,这不是作为线程安全代码呈现,但它对于实验很有用。) 您可以将调试器设置在终结中的最后一个 closeFile 处,并将其停放在那里,只要您愿意,线程就不会再次写入该文件。这告诉我们,当最终代码命中时,拥有的线程已经死亡。

根据您的兴趣程度,您还可以 checkin 表单的 OnClose、覆盖主表单的 Close 方法等。

这在我们的理解中留下了一些漏洞,例如主窗体是否正式终止每个线程,但我相信您可以从中找出如何测试它。 (快速浏览表单源代码并没有特别揭示什么。)

关于multithreading - Delphi 当应用程序在线程等待事件时终止时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67246114/

相关文章:

regex - 在 Delphi 中从 .dfm 文件中删除属性的快速方法

sql-server - 跨不同 SQL 数据库兼容的 DDL(CREATE TABLE)?

xcode - 键盘事件不适用于 Xcode 上的 irrlicht

c# - 当窗口不再位于顶部时的 WPF 事件

javascript onclick 不工作?

multithreading - +[NSThread detachNewThreadSelector :toTarget:withObject:] and -[NSObject performSelectorInBackground:withObject:]? 和有什么区别

java - MotionEvent.obtain(…);不像屏幕上的攻丝

c++ - 在一次调用中启动多个线程 C++ 11

c# - 强制 .NET、多线程 volatile 优化错误

delphi - 跳转到finally而不退出函数/过程