Eine geeignete Methode, um ein TThread-Objekt zu zerstören

Diese Frage mag trivial erscheinen, aber ich hoffe, Sie werden sie nicht ignorieren.
Bevor ein TThread-Objekt zerstört wird, muss normalerweise gewartet werden, bis der Thread, der die Methode TThread.Execute () aufgerufen hat, beendet ist. Nur dann können wir sicher sein, dass beispielsweise nicht mehr auf die Objekte zugegriffen wird, die im Destruktor der Klasse zerstört wurden. Daher ist es erforderlich, Terminate aufzurufen, um das Flag Terminated zu setzen, das der Thread überprüfen muss, um zu wissen, ob er beendet werden soll, und anschließend die WaitFor () - Methode aufzurufen.

Da der Thread möglicherweise angehalten wird, empfiehlt es sich, ihn vor dem Aufruf von WaitFor fortzusetzen, da sonst der aufrufende Thread blockiert wäre. Und weil der Thread mehrmals unterbrochen werden kann, sollte er gleich oft fortgesetzt werden, oder?

while Suspended do
  Resume;

Wenn der Thread suspendiert erstellt wurde, müssen wir nicht befürchten, dass die TThread.Execute () -Methode aufgerufen wird, wenn wir den Thread nur fortsetzen, um ihn zu beenden - dies wird nicht der Fall sein (bitte korrigieren Sie mich, wenn ich falsch liege).

Was ich angegeben habe, schlägt vor, die folgenden Codezeilen für jedes freizugebende TThread-Objekt zu verwenden:

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

Wenn wir unsere Anwendung zerstören, die mehrere Threads erstellt hat, macht das Schreiben eines solchen Codeteils für jedes zu zerstörende TThread-Objekt den Code leider sehr lang und möglicherweise sogar undurchsichtig.

Daher bin ich zu dem Schluss gekommen, dass all dies in einem überschriebenen Destruktor der TThread-Klasse abgelegt werden kann, dank dessen es ausreichen würde, MyThread.Free (oder MyThread.Terminate, wenn MyThread.FreeOnTerminate gesetzt ist) aufzurufen, ohne sich darum zu kümmern, ob der Destruktor zerstört wurde Objekt ist ein TThread-Objekt oder nicht:

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;

Verzeihen Sie, dass ich eine so grundlegende Frage stelle. Ich möchte jedoch Ihre Meinung dazu kennenlernen, wie - ich hoffe auf universelle Weise - TThread-Objekte zerstört werden können. Ich stelle diese Fragen, weil ich von den Codes meiner Arbeitskollegen erfahren habe, dass sie normalerweise das erste Codebeispiel zum Zerstören solcher Objekte verwendeten, aber sie prüften nie, ob die Threads, auf die gewartet wurde, nicht angehalten wurden, was ich als etwas gefährlich betrachtete, wenn die Threads könnte irgendwo im Code suspendiert sein. Deshalb habe ich versucht, einen universellen Weg zu finden, um die Objekte dieser Klasse zu zerstören, der den Code klarer und sicherer macht. Ich hoffe, ich habe es nicht schlimmer gemacht - was denkst du?

Vielen Dank für Ihre Anregungen im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage