Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 14:00
So ist es richtig und ausreichend:
(Ich habe mir erlaubt aus MyEvent ein FMyEvent um zu verdeutlichen, dass es sich um ein Feld der Klasse handelt)
Delphi-Quellcode:
procedure TMyThread.TerminatedSet;
begin
  inherited;
  FMyEvent.SetEvent; // auf jeden Fall auch NACH INHERITED!!!!
end;

Procedure TMyThread.Execute;
begin
  While not Terminated do
   begin
     FMyEvent.WaitFor(infinite);
     if not(Terminated) then
       begin
         // Mach was schlaues...
       end;
   end;
end;

Destructor TMyThread.destroy;
begin
  Inherited;
  FMyEvent.Free; // NACH INHERITED!!!!!!
end;
Wen man wissen möchte, warum das reicht, dann schaut man sich den Source von TThread.Destroy einfach mal an (so habe ich auch herausgefunden, warum das so ausreicht) und sieht dort folgende lustige Dinge:
Delphi-Quellcode:
destructor TThread.Destroy;
begin
  if (FThreadID <> 0) and not FFinished and not FExternalThread then
  begin
    Terminate;
    if FCreateSuspended or FSuspended then
      Resume;
{$IFDEF MSWINDOWS}
    while not FStarted do
{$ELSE}
    while not ((not FCreateSuspended or FInitialSuspendDone) and FStarted) do
{$ENDIF}
      Yield;
    WaitFor;
  end;
  ...
end;
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 (21. Mai 2014 um 14:04 Uhr)
  Mit Zitat antworten Zitat