Une manière appropriée de détruire un objet TThread

Cette question peut sembler triviale, mais j'espère que vous ne l'ignorez pas.
Avant de détruire un TThread objet, il est généralement nécessaire d'attendre jusqu'à ce que le thread qui a appelé la TThread.Méthode Execute() de finitions, car alors seulement pouvons-nous être sûr que, par exemple, les objets détruits à l'intérieur de la classe destructeur ne sont plus accessibles. Par conséquent, il est nécessaire de faire appel à mettre fin à l'ensemble de la Résiliation du pavillon que le fil est de vérifier pour savoir si à la sortie ou pas, et ensuite appeler la WaitFor ().

Parce que le fil peut être suspendu, je pense qu'il est bon de le reprendre avant d'appeler WaitFor, car sinon, le thread appelant serait dans l'impasse. Et parce que le fil peut être suspendu à plusieurs reprises, il doit être repris le même nombre de fois, non?

while Suspended do
  Resume;

Si le thread a été créé en suspension, nous n'avons pas à craindre que le TThread.La méthode Execute() sera appelée lorsque nous reprendre le fil uniquement pour y mettre fin, il ne va pas (corrigez-moi si je me trompe).

Ce que j'ai énoncé suggère d'utiliser les lignes de code suivantes pour chaque TThread objet d'être libéré:

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

Malheureusement, lorsque nous détruisons notre application qui a créé plusieurs threads, l'écriture d'un morceau de code pour chaque TThread objet détruit inutilement rend le code très long et peut-être même opaque.

Donc je suis venu à la conclusion que tous ces pourrait être mis à l'intérieur d'un écrasé le destructeur de la classe TThread grâce à laquelle il suffirait d'appeler le MyThread.Gratuit (ou MyThread.Fin si MyThread.FreeOnTerminate est réglé) sans se soucier de savoir si l'objet détruit est un TThread objet ou pas:

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;

Pardonnez-moi de poser cette question fondamentale. Je tiens, cependant, à obtenir de connaître votre avis sur cette façon - je l'espère, un moyen universel de détruire TThread objets. Je pose cette questions car je appris de mes collègues de travail sur les codes habituellement utilisés le premier exemple de code pour détruire ces objets, mais ils n'ont jamais utilisé pour vérifier si les fils étant attendu n'ont pas été suspendu que je considérais un peu dangereux si les threads peut être suspendu quelque part dans le code. Donc j'ai essayé de trouver un moyen universel de détruire les objets de cette classe qui permettrait de rendre le code plus clair et plus sûr. J'espère que je n'ai pas faire pire - qu'en pensez-vous?

Merci pour vos suggestions à l'avance.

source d'informationauteur Mariusz Schimke