Правильный способ уничтожения объекта TThread

Этот вопрос может показаться тривиальным, но я надеюсь, вы его не проигнорируете.
Прежде чем уничтожить объект TThread, обычно необходимо дождаться завершения потока, вызвавшего метод TThread.Execute (), поскольку только тогда мы можем быть уверены, что, например, к объектам, уничтоженным внутри деструктора класса, больше нет доступа. Поэтому необходимо вызвать Terminate, чтобы установить флаг Termination, который поток должен проверить, чтобы узнать, выходить или нет, а затем вызвать метод WaitFor ().

Поскольку поток может быть приостановлен, я думаю, что было бы целесообразно возобновить его перед вызовом WaitFor, иначе вызывающий поток будет заблокирован. И поскольку поток может быть приостановлен несколько раз, он должен быть возобновлен столько же раз, верно?

while Suspended do
  Resume;

Если поток был создан приостановленным, нам не нужно беспокоиться о том, что метод TThread.Execute () будет вызываться, когда мы возобновляем поток только для его прекращения - не будет (пожалуйста, исправьте меня, если я ошибаюсь).

То, что я сказал, предлагает использовать следующие строки кода для каждого освобождаемого объекта TThread:

MyThread.Terminate;
while MyThread.Suspended do
  MyThread.Resume;
MyThread.WaitFor;
MyThread.Free;

К сожалению, когда мы уничтожаем наше приложение, которое создало несколько потоков, написание такого фрагмента кода для каждого уничтожаемого объекта TThread излишне делает код очень длинным и, возможно, даже непрозрачным.

Поэтому я пришел к выводу, что все это можно поместить в переопределенный деструктор класса TThread, благодаря которому было бы достаточно вызвать MyThread.Free (или MyThread.Terminate, если задано MyThread.FreeOnTerminate), не заботясь о том, уничтоженный объект является объектом TThread или нет:

destructor TMyThread.Destroy;
begin
  //if FreeOnTerminate, the calling thread cannot wait for itself
  if GetCurrentThreadId <> ThreadId then
  begin
    Terminate;
    while Suspended do
      Resume;
    WaitFor;
  end;

  {free all objects created in this class}

  inherited Destroy;
end;

Прошу меня задать такой простой вопрос. Я хотел бы, однако, узнать ваше мнение об этом способе - я надеюсь, универсальный способ - уничтожить объекты TThread. Я задаю этот вопрос, потому что я узнал из кодов моих коллег по работе, что они обычно использовали первый пример кода для уничтожения таких объектов, но они никогда не использовали, чтобы проверить, не приостановлены ли ожидающие потоки, что я считал немного опасным, если потоки может быть приостановлено где-то в коде. Поэтому я попытался найти универсальный способ уничтожения объектов этого класса, который сделал бы код более понятным и безопасным. Надеюсь, хуже не стало - как ты думаешь?

Спасибо за ваши предложения заранее.

Ответы на вопрос(2)

Ваш ответ на вопрос