【问题标题】:Do I have to signal an anonymous thread to exit if the main thread is done? [duplicate]如果主线程完成,我是否必须通知匿名线程退出? [复制]
【发布时间】:2015-04-12 06:39:16
【问题描述】:

假设我有一个匿名线程做一些后台处理:

procedure TForm1.FormCreate(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure begin
    while True do begin
      Sleep(500);
      OutputDebugString('I am alive');
    end;
  end).Start;
end;

线程不与主线程共享任何资源,它只是坐在那里“永远”运行。

既然没有像Terminatefor anonymous threads这样的内置机制,那是不是说我在进程的主线程退出时就不用通知线程了?

如果您只是启动一个新的 VCL 应用程序并将上面的代码粘贴到 FormCreate 事件中,它将每半秒将 I am alive 写入调试消息。当应用程序退出时(即通过关闭表单),似乎线程也退出了,尽管它不检查任何信号。

这样可以吗,还是我必须使用TEvent 或类似的方法来实现一些信号来通知线程?

还是写一个自定义的TThread后代并保留对Thread.Free的线程引用更好?

【问题讨论】:

    标签: multithreading delphi synchronization delphi-xe2 terminate


    【解决方案1】:

    您需要终止您创建的任何线程,甚至是匿名线程,例如:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TThread.CreateAnonymousThread(procedure begin
        while not Application.Terminated do begin // <--
          Sleep(500);
          OutputDebugString('I am alive');
        end;
      end).Start;
    end;
    

    【讨论】:

    • 这不一定会在应用程序退出时终止匿名线程。如果循环执行的时间超过几毫秒,ExitProcess 调用将终止循环中某个位置的线程的可能性更高。
    • 是的,尽管在设置 Application.Terminated 和调用 ExitProcess() 之间有一个小的宽限期,因为 VCL/RTL 必须先清理自己。但你是对的。更好的解决方案是跟踪线程,手动终止它,等待它完全终止,然后退出应用程序。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多