Должен ли я сигнализировать анонимному потоку о выходе, если основной поток выполнен?

Предположим, у меня есть анонимный поток, который выполняет некоторую фоновую обработку:

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

Поток не разделяет никаких ресурсов с основным потоком, он просто сидит там и работает «навсегда».

Поскольку нет встроенного механизма, такого как Terminate для анонимных threads, означает ли это, что мне не нужно уведомлять поток о завершении основного потока процесса?

Если вы просто запустите новое приложение VCL и вставите приведенный выше код в событие FormCreate, оно будет писать I am alive каждые полсекунды в сообщения отладки. При выходе из приложения (т. е. при закрытии формы) создается впечатление, что поток также завершается, несмотря на то, что он не проверяет наличие каких-либо сигналов.

Это нормально, или мне нужно реализовать какой-то сигнал, используя TEvent или аналогичный, чтобы уведомить поток?

Или лучше написать кастомный TThread потомок и сохранить ссылку на ветку, чтобы потом Thread.Free его ?


person Jens Mühlenhoff    schedule 11.02.2015    source источник


Ответы (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;
person Remy Lebeau    schedule 11.02.2015
comment
Это не обязательно завершит анонимный поток при выходе из приложения. Вероятность того, что вызов ExitProcess прервет поток где-то в середине цикла, выше, если цикл делает что-либо дольше, чем несколько мс. - person Sertac Akyuz; 19.12.2018
comment
Верно, хотя между установкой Application.Terminated и вызовом ExitProcess() есть небольшой льготный период, поскольку VCL/RTL должен сначала очиститься. Но вы правы. Лучшим решением является отслеживание потока, завершение его вручную и ожидание его полного завершения, прежде чем выйти из приложения. - person Remy Lebeau; 19.12.2018