如果主线程完成,我是否必须发出匿名线程的信号?

Jen*_*off 3 delphi multithreading synchronization terminate delphi-xe2

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

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

该线程不与主线程共享任何资源,它只是坐在那里并"永远"运行.

由于没有像Terminate 匿名线程那样的内置机制,这是否意味着当进程的主线程退出时我不必通知线程?

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

没关系,还是我必须使用TEvent或类似的方式实现一些信号来通知线程?

或者编写自定义TThread后代并在以后保留对该线程的引用是否更好Thread.Free

Rem*_*eau 7

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

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;
Run Code Online (Sandbox Code Playgroud)