AGB  ·  Datenschutz  ·  Impressum  







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

Wo wird Thread freigegeben?

Ein Thema von TheMiller · begonnen am 6. Mär 2009 · letzter Beitrag vom 6. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 18:40
Hallo.

Habe einen Thread, der nach Abschluss eine Methode der VCL aufruft. Habe also den Thread so konfiguriert:

Delphi-Quellcode:
  UpdateSucher:=TSeekUpdate.Create(True);
  UpdateSucher.OnTerminate:=AfterSeekUpdates;
  UpdateSucher.FreeOnTerminate:=False;
  UpdateSucher.Resume;
Wenn ich nun innerhalb der AfterSeekUpdates-Methode den Thread mit UpdateSucher.Free freigeben will, hängt das gesamte Programm unwiderruflich. Rufe ich UpdateSucher.free woanders auf, dann ist alles wunderbar. Nun meine Frage: Wo soll ich den Thread freigeben? Sofort funktioniert nicht, da ich auf Daten des Threads noch zugreifen muss - deswegen auch AfterSeekUpdates!

Danke
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 18:45
TThread.Free ruft WaitFor auf, sodass es einen Deadlock gibt. Setze doch einfach FreeOnTerminate auf True, dann gibt sich der Thread nach dem OnTerminate selbst frei.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 18:45
Einfach im Quelltext, wo du auch den Thread erstellst
Delphi-Quellcode:
  if Assigned(UpdateSucher) then
  begin
    FLogThread.Terminate;
    FLogThread.WaitFor;
    FreeAndNil(UpdateSucher);
  end;
Dann wird mit Terminate deine onTerminate-Methode aufgerufen und wenn er fertig terminiert ist, kannst du ihn beenden.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#4

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:34
Hm. ich weis nicht, ob ich das so richtig verstanden habe. Ich lasse den Thread ja extra nicht selbst zerstören, da ich noch auf Daten aus dem Thread zugreifen möchte. Und wenn ich den vorher geposteten Quelltext gleich nach dem erstellen aufrufe, dann wird er doch beendet, bevor er überhaupt fertig ist... also so:

Delphi-Quellcode:
  UpdateSucher:=TSeekUpdate.Create(True);
  UpdateSucher.OnTerminate:=AfterSeekUpdates;
  UpdateSucher.FreeOnTerminate:=False;
  UpdateSucher.Resume;

  if Assigned(UpdateSucher) then
  begin
    FLogThread.Terminate;
    FLogThread.WaitFor;
    FreeAndNil(UpdateSucher);
  end;
Das ist so bestimmt nicht richtig, oder?
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:39
Hi,

die "OnTerminate" Prozedur wird in jedem Fall vor dem Freigeben des Threads aufgerufen.
Erst danach wird der Thread sich selbst freigeben. Solltest Du also nur in dieser Methode auf die Daten des Thread zugreifen wollen, ist das vollkommen in Ordnung.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:48
Ich weis nicht, ob wir aneinander vorbeireden...

wenn ich den Thread erstelle und SOFORT folgenden Code direkt unter das Erstellen schreibe, dann wird der Thread doch garnicht bis zum Schluss ausgeführt. Die Daten hole ich mir aus dem OnTerminate-Ereignis. Ich meine diesen Code

Delphi-Quellcode:
if Assigned(UpdateSucher) then
  begin
    FLogThread.Terminate;
    FLogThread.WaitFor;
    FreeAndNil(UpdateSucher);
  end;
Oder kann ich das Erstellen und Terminieren untereinanderschreiben, ohne dass der Ablauf der Threads terminiert wird?
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:52
Zitat von DJ-SPM:
Sofort funktioniert nicht, da ich auf Daten des Threads noch zugreifen muss - deswegen auch AfterSeekUpdates!
Also ich sehe da kein Problem mit FreeOnTerminate := True. Du solltest im OnTerminate noch auf die Daten zugreifen können, der Thread wird anschließend freigegeben. Im OnTerminate kannst Du natürlich Diene Variable "UpdateSucher" auf nil setzen, falls Du die öfter verwenden willst...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:55
Hm..

da hast du auch wieder Recht. Das habe ich einfach übersehen bzw nicht bedacht. Ich werde das so mal machen. Wenn's nicht klappt, dann werden wir uns hier bestimmt nochmal lesen - aber wieso sollte das nicht funktionieren.

Danke
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:56
Also:
Du erstellst den Thread, er geht über in die Execute Methode.
Gleich danach terminierst du diesen, daher wartet der Thread bis er die Execute-Methode verlassen hat und geht über in die von dir festgelegte onTemrinate-Methode. In dieser greifst du die Werte von bestimmten Eigenschaften ab und abschließend geht der Thread auch aus dieser Methode weiter.
MIt WaitFor wird gewartet, bis der Thread sich selber beendet hat, ehe mit FreeAndNil die Instanz aus dem Speicher gelöscht wird.

Es wäre wohl trotzdem besser, du stellt FreeonTerminate auf True und greifst wie zuvor in deiner onTerminate-Methode auf die Eigenschaften zu. Dann kannst du gewiss sein, das dein Thread fertig geworden ist. Setzt du noch einen Rückgabewert für das Beenden und wartest im Quellcode mit WaitForSingleObject(UpdateSucher.Handle, INFINITE) = <RückgabeWert>; bist du ebenfalls auf der sicheren Seite ...
Aber sowas schlug ja Apollonius in #2 schon vor.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#10

Re: Wo wird Thread freigegeben?

  Alt 6. Mär 2009, 20:59
Vielen Dank für die Erklärung. Wusste nicht, dass der Thread die Execute-Methode trotzdem bis zum Schluss ausführt! Danke
  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 17:25 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