Uma maneira correta de destruir um objeto TThread

Essa pergunta pode parecer trivial, mas espero que você não a ignore.
Antes de destruir um objeto TThread, geralmente é necessário esperar até que o thread que chamou o método TThread.Execute () seja concluído, pois somente assim podemos ter certeza de que, por exemplo, os objetos destruídos dentro do destruidor da classe não serão mais acessados. Portanto, é necessário chamar Terminate para definir o sinalizador Terminated que o thread deve verificar para saber se deve sair ou não e, em seguida, chamar o método WaitFor ().

Porque o segmento pode ser suspenso, eu acho que é bom para retomá-lo antes de chamar WaitFor, caso contrário, o segmento de chamada seria deadlocked. E porque o thread pode ser suspenso várias vezes, deve ser retomado o mesmo número de vezes, certo?

while Suspended do
  Resume;

Se o encadeamento foi criado suspenso, não precisamos nos preocupar que o método TThread.Execute () será chamado quando retomarmos o encadeamento apenas para finalizá-lo - não será (corrija-me se estiver errado).

O que afirmei sugere o uso das seguintes linhas de código para cada objeto TThread sendo liberado:

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

Infelizmente, quando destruímos nosso aplicativo que criou vários encadeamentos, a gravação desse pedaço de código para cada objeto TThread sendo destruído desnecessariamente torna o código muito longo e talvez até mesmo opaco.

Portanto, cheguei a uma conclusão de que tudo isso poderia ser colocado dentro de um destruidor overriden da classe TThread, graças ao qual seria suficiente chamar MyThread.Free (ou MyThread.Terminate se MyThread.FreeOnTerminate estivesse definido) sem se importar se o destruído objeto é um objeto TThread ou não:

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;

Perdoe-me fazendo uma pergunta tão básica. Gostaria, no entanto, de conhecer suas opiniões sobre esse caminho - espero uma maneira universal - de destruir objetos TThread. Eu faço essas perguntas, pois aprendi com os códigos dos meus colegas de trabalho que eles costumavam usar o primeiro exemplo de código para destruir tais objetos, mas nunca costumavam verificar se os threads que estavam sendo aguardados não estavam suspensos, o que eu considerava um pouco perigoso pode ser suspenso em algum lugar no código. Por isso, tentei encontrar uma maneira universal de destruir os objetos dessa classe que tornaria o código mais claro e seguro. Espero não ter piorado - o que você acha?

Obrigado por suas sugestões com antecedência.

questionAnswers(2)

yourAnswerToTheQuestion