AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TEvent.free im Thread Destructor?

Ein Thema von Mavarik · begonnen am 21. Mai 2014 · letzter Beitrag vom 22. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#1

TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 12:20
Hallo Zusammen.

Gegeben sei ein Thread der ein MyEvent := TEvent... handle hat.
Delphi-Quellcode:
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;
Mavarik
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 12:28
Delphi-Quellcode:
if Mavarik.Erstellt(MyEvent).Im(Konstruktor) then
  result := Gut
else
  result := Not Gut;
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 12:33
Delphi-Quellcode:
if Mavarik.Erstellt(MyEvent).Im(Konstruktor) then
  result := Gut
else
  result := Not Gut;
LOL...

Delphi-Quellcode:
Constructor TMyThread.Create;
begin
  inherited Create(true);

  MyEvent := TEvent.Create(NIL,false,false,'');
  ....
end;

Const
  Mavarik = Gut;
Danke

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.

Geändert von Mavarik (21. Mai 2014 um 12:35 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 12:58
Der Punkt ist folgender: Dein Thread läuft. Er ist zwar nicht sonderlich aktiv und wartet bis zum Tag des jüngsten Gerichts dass myEvent eintritt, aber er ist gestartet.

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 TerminatedSet ü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.

Siehe auch hier: http://www.delphipraxis.net/1254537-post13.html
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 13:49
Der Punkt ist folgender: Dein Thread läuft. Er ist zwar nicht sonderlich aktiv und wartet bis zum Tag des jüngsten Gerichts dass myEvent eintritt, aber er ist gestartet.

Wenn du ihn terminierst, läuft er weiter. Und weiter. Denn er wartet auf das Event.
emm... Nein...

Deswegen mache ich ja ein
   MyEvent.SetEvent;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 13:53
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
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
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 14:05
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; // Erst ab XE? jedenfalls gibt es das nicht in D2007
begin
  inherited;
  FMyEvent.SetEvent;
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!!!!!! Stimmt hab ich auch gefunden!
end;
s.o.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 14:06
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.
Waitfor nicht nötig da im Thread Destructor schon vorhanden!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: TEvent.free im Thread Destructor?

  Alt 21. Mai 2014, 15:11
Waitfor nicht nötig da im Thread Destructor schon vorhanden!
Wenn man es denn in der Reihenfolge aufruft wie Sir Rufo geschrieben hat, funktioniert das auch, ja.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz