Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ist Komponente (TThread) freigegeben? (https://www.delphipraxis.net/86988-ist-komponente-tthread-freigegeben.html)

CK_CK 21. Feb 2007 20:21


Ist Komponente (TThread) freigegeben?
 
Hallo,
ich hab' ein kleines Problem. Und zwar habe ich eine Komponente von TThread abgeleitet.
Ich setze am Anfang der Execute-Methode den Wert FreeOnTerminate auf True, sodass der Thread sich selbst freigibt, wenn er fertig ist.

Wie kann ich jetzt im Hauptprogramm herausfinden, ob der Thread freigegeben ist?
Probiert habe ich folgendes:
Delphi-Quellcode:
if komponente = nil then...
Aber das funktioniert leider nicht :cry:

Weiß jemand Rat?

Chris

Dani 21. Feb 2007 20:39

Re: Ist Komponente (TThread) freigegeben?
 
Der Thread könnte per Event melden, dass die Execute-Methode am Ende ist und der Thread jetzt beendet wird.
Vielleicht bringt TThread so ein Event auch schon von Haus aus mit, bin mir nicht sicher.
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
...
  if Assigned(FOnThreadFinished) then FOnThreadFinished(Self); //oder so...
end;

thkerkmann 21. Feb 2007 21:00

Re: Ist Komponente (TThread) freigegeben?
 
Hi,

schau mal nach TThread.OnTerminate

das ist das Event.

Gruss

CK_CK 21. Feb 2007 21:09

Re: Ist Komponente (TThread) freigegeben?
 
Hi!

Vielen Dank für eure Antworten. Zur Not werde ich es wohl so machen (ist nur so unpraktisch, wenn ich für jeden Thread auch noch eine Variable erstellen muss, die anzeigt, ob er fertig ist...).

Wenn doch noch jemandem eine einfachere Methode einfällt (am liebsten wäre mir: IstFreigegeben(komponente) mit Rückgabewert Boolean), immer her damit... :stupid:

Einen schönen Abend noch,
Chris

CK_CK 23. Feb 2007 14:32

Re: Ist Komponente (TThread) freigegeben?
 
*PUSH*
Letzter Versuch, ansonsten muss ich die Lösung mit dem Event nehmen... :cry:

Chris

Luckie 23. Feb 2007 14:34

Re: Ist Komponente (TThread) freigegeben?
 
Setz die Variable auch auf nil, wenn du sie freigibst.

CK_CK 23. Feb 2007 15:07

Re: Ist Komponente (TThread) freigegeben?
 
Wie meinst du das denn?
Soll ich innerhalb der Komponente in der überschriebenen Destroy-Methode Self := nil; schreiben?
Oder innerhalb der Hauptanwendung komponenze := nil;? Aber woher soll die wissen, dass der Thread fertig ist?

Oder stelle ich mich gerade blöd an? :stupid:

Chris

Luckie 23. Feb 2007 15:12

Re: Ist Komponente (TThread) freigegeben?
 
Gibt man ein Objekt mit free frei wird das Objekt zwar aus dem Speicher entfernt, die Variable aber beinhaltet noch einen, nicht mehr gültigen, Zeiger auf einen Speicherbereich. Somit schlägt Assigned oder die Abfrage auf nil fehl und ergibt true.

Delphi-Quellcode:
  FreeAndNil(obj);
Oder

Delphi-Quellcode:
  obj.Free;
  obj := nil;
Aber da du einfach zu wenig Informationen gibst, wie das Threadobjekt erzeugt wird, was das Threadobjekt macht und wie es wieder freigegeben wird, kann man dir auch nicht so recht helfen.

CK_CK 23. Feb 2007 15:22

Re: Ist Komponente (TThread) freigegeben?
 
Oh, entschuldigung :oops:

Also, eine genaue Beschreibung:
Ich habe einen Thread, der mit Hilfe von IdFTP eine Datei runterlädt. Die IdFTP wird im überschriebenen Create des Threads erzeugt und im überschriebenen Destroy wieder freigegeben.
Im Create des Threads setze ich außerdem die Variable FreeOnTerminate auf True. Dadurch sollte der Thread sich nach ausführen der Execute-Methode selbst freigeben.

Diesen Thread erzeuge ich im Programm dynamisch mit DL := TMyThread.Create(True); (True, damit er nicht sofort startet). Wenn ich jetzt mit einem Button z.B. den Thread anhalten will, muss ich irgendwie vorher wissen, ob er fertig ist, also habe ich folgendes versucht:
Delphi-Quellcode:
if DL <> nil then
begin
  if DL.Suspended then
    DL.Resume
  else
    DL.Suspend;
end;
Da aber, wie du bereits gesagt hast, die Objektvariable nicht auf nil gesetzt wird, wenn der Thread fertig ist, weiß ich nicht, wie ich sonst prüfen soll, ob der Thread fertig ist.

An welcher Stelle müsste ich das FreeAndNil denn verwenden? Innerhalb der Destroy-Methode des Threads bekomme ich eine AV, wenn ich FreeAndNil(Self); schreibe.

Chris

markusj 23. Feb 2007 16:32

Re: Ist Komponente (TThread) freigegeben?
 
Vorschlag: Du legst einen Counter an, der beim Starten eines Threads inkrementiert und beim beenden dekrementiert wird.
Ist die Variable = 0, läuft kein Thread mehr.

mfG
Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.
Seite 1 von 2  1 2      

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