Thema: Delphi Arbeiten mit TThreadList

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#28

AW: Arbeiten mit TThreadList

  Alt 25. Jun 2014, 20:42
Ein Problem sehe ich hier im Destructor
Delphi-Quellcode:
destructor TD2007Thread.Destroy;
begin
  if (FThreadID <> 0) and not FFinished then
  begin
    Terminate;
    if FCreateSuspended then
      Resume;
    WaitFor; // Diese Stelle ist problematisch
  end;
Das Problem kann hier auftauchen:
Delphi-Quellcode:
var
  LThread : TThread;
begin
  LThread.Create( True );
  LThread.Free;
end;
Denn nun wird zwar im Destructor korrekterweise das Delphi-Referenz durchsuchenTThread.Resume aufgerufen, allerdings dauert es eine geraume Zeit bis der Thread wirklich losläuft und somit auch Delphi-Referenz durchsuchenTThread.WaitFor eine Chance hat darauf zu warten bis der Thread wirklich wieder beendet ist. Hier kann es also passieren, dass nun nicht gewartet wird, der Destructor weiter ausgeführt wird und irgendwann der Thread eigentlich erst losläuft.

In neueren Delphi-Versionen wird genau nach dem Resume noch in Kombination mit Delphi-Referenz durchsuchenTThread.Yield (ab XE) gewartet bis der Thread auch wirklich angelaufen ist.
Delphi-Quellcode:
if FCreateSuspended or FSuspended then
  Resume;
while not FStarted do
  Yield;
WaitFor;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Jun 2014 um 20:52 Uhr)
  Mit Zitat antworten Zitat