![]() |
TEvent.free im Thread Destructor?
Hallo Zusammen.
Gegeben sei ein Thread der ein
Delphi-Quellcode:
handle hat.
MyEvent := TEvent...
Delphi-Quellcode:
Mavarik
Procedure TMyThread.Execute;
begin While not Terminated do begin MyEvent.WaitFor(infinite); if not(Terminated) then begin // Mach was schlaues... end; end; end; Destructor TMyThread.destroy; begin Terminate; MyEvent.SetEvent; MyEvent.Free; // Gut oder schlecht??? Inherited; end; |
AW: TEvent.free im Thread Destructor?
Delphi-Quellcode:
if Mavarik.Erstellt(MyEvent).Im(Konstruktor) then
result := Gut else result := Not Gut; |
AW: TEvent.free im Thread Destructor?
Zitat:
Delphi-Quellcode:
Danke
Constructor TMyThread.Create;
begin inherited Create(true); MyEvent := TEvent.Create(NIL,false,false,''); .... end; Const Mavarik = Gut; PS.: Die eigentliche Frage war, wird bei MyEvent.SetEvent der Thread sofort gestartet oder kann es sein, dass die MyEvent.WaitFor(Infinite); plötzlich keinen Rücksprung mehr hat. |
AW: TEvent.free im Thread Destructor?
Der Punkt ist folgender: Dein Thread läuft. Er ist zwar nicht sonderlich aktiv und wartet bis zum Tag des jüngsten Gerichts dass
Delphi-Quellcode:
eintritt, aber er ist gestartet.
myEvent
Wenn du ihn terminierst, läuft er weiter. Und weiter. Denn er wartet auf das Event. Daher würde ich in deinem Thread noch die Methode
Delphi-Quellcode:
überschreiben: Diese sollte sich um das Setzen des Events kümmern, damit der Thread nicht ewig dort in seinem Execute darauf wartet, sollte es nie eingetreten sein.
TerminatedSet
Siehe auch hier: ![]() |
AW: TEvent.free im Thread Destructor?
Zitat:
Deswegen mache ich ja ein
Delphi-Quellcode:
MyEvent.SetEvent;
|
AW: TEvent.free im Thread Destructor?
Terminate gehört eigentlich nicht in den Destruktor, der ist rein zum Aufräumen da. Oder wenn es dort schon steht, sollte dann ein WaitFor auf den Thread folgen, in diesem Fall nach dem SetEvent. Danach kannst du ruhigen Gewissens alles freigeben.
Bei mir steht die Sequenz Terminate, WaitFor, Free außerhalb des Threads. |
AW: TEvent.free im Thread Destructor?
So ist es richtig und ausreichend:
(Ich habe mir erlaubt aus
Delphi-Quellcode:
ein
MyEvent
Delphi-Quellcode:
um zu verdeutlichen, dass es sich um ein Feld der Klasse handelt)
FMyEvent
Delphi-Quellcode:
Wen man wissen möchte, warum das reicht, dann schaut man sich den Source von
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;
Delphi-Quellcode:
einfach mal an (so habe ich auch herausgefunden, warum das so ausreicht) und sieht dort folgende lustige Dinge:
TThread.Destroy
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; |
AW: TEvent.free im Thread Destructor?
Zitat:
|
AW: TEvent.free im Thread Destructor?
Zitat:
|
AW: TEvent.free im Thread Destructor?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz