Нет, ваш код не очень хороший (хотя, вероятно, он будет работать в 99,99% или даже в 100% случаев).Если вы планируете завершить рабочий поток из основного потока, не устанавливайте FreeOnTerminate в True (я не вижу, что вы пытаетесь получить в приведенном выше коде, установив FreeOnTerminate в True, по крайней мере это делает ваш код менее понятным).
Более важной ситуацией с завершением рабочих потоков является то, что вы пытаетесь закрыть приложение, когда рабочий поток находится в состоянии ожидания.Поток не будет пробужден, если вы просто вызовете Terminate, обычно вы должны использовать дополнительный объект синхронизации (обычно событие) для пробуждения рабочего потока.
И еще одно замечание - в
* нет необходимости1006 *
Если вы посмотрите на код TThread.Destroy, он вызывает Terminate и WaitFor, поэтому достаточно
MyThread.Free;
(по крайней мере, в Delphi 2009 нет источников Delphi 7 для проверки).
Обновлено
Прочитать Mghie ответ.Рассмотрим следующую ситуацию (лучше в системе с 1 ЦП):
выполняется основной поток
procedure TMainForm.Close;
begin
if not MyThreadReady then
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
end;
, он проверил значение MyThreadReady (неверно) и был отключен планировщиком.
Теперь планировщик переключается на рабочий поток;он выполняет
Synchronize(ThreadFinished);
и заставляет планировщик переключиться обратно в основной поток.Основной поток продолжает выполнение:
MyThread.Terminate; // no problem
MyThread.WaitFor; // ???
MyThread.Free;
Можете ли вы сказать, что произойдет на WaitFor?Я не могу (требует более глубокого изучения источников TThread, чтобы ответить, но на первый взгляд выглядит как тупик).
Ваша настоящая ошибка в чем-то другом - вы написали ненадежный код и пытаетесь выяснить, верен он или нет.Это плохая практика с потоками - вместо этого вы должны научиться писать надежный код.
Что касается ресурсов - когда TThread (с FreeOnTerminate = False) завершается, единственными ресурсами, которые остаются выделенными, является дескриптор потока Windows (он не использует значительные ресурсы Windows после завершения потока) и объект Delphi TThread в памяти,Не большая цена, чтобы быть на безопасной стороне.