Delphi-PRAXiS

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

CK_CK 23. Feb 2007 17:43

Re: Ist Komponente (TThread) freigegeben?
 
Das ist eine gute Idee!

So werd' ich's machen. Vielen Dank :mrgreen:

Chris

Jelly 23. Feb 2007 18:02

Re: Ist Komponente (TThread) freigegeben?
 
Zitat:

Zitat von CK_CK
Und zwar habe ich eine Komponente von TThread abgeleitet.

:shock: Wie geht das. TThread erbt direkt von TObject :gruebel:

Zitat:

Zitat von CK_CK
Wie kann ich jetzt im Hauptprogramm herausfinden, ob der Thread freigegeben ist?

Die einzig brauchbare lösung ist via Event aus dem Thread heraus an dein Hauptprogramm. Denn was machst dein ganzes Threading für einen Sinn, wenn du aus dem Hauptprogramm heraus in einer Schleife prüfen musst, ob der/die Threads beendet sind.

Die Sache mit dem Threadcounter ist der richtige Weg, aber nur wenn dein Hauptthread wiederrum via Event darüber benachichtigt wird, wenn ein Thread terminiert. Dafür gibts bereits das eingeleitete Event OnTerminate in TThread. Sieh dir mal das ThreadDemo in den Delphi Demos an.

CK_CK 23. Feb 2007 18:29

Re: Ist Komponente (TThread) freigegeben?
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von CK_CK
Und zwar habe ich eine Komponente von TThread abgeleitet.

:shock: Wie geht das. TThread erbt direkt von TObject :gruebel:

NEIN! Ich hab' mich falsch ausgedrückt!
Eine Komponente meine ich nicht. Ich habe eine Klasse von TThread abgeleitet... :oops: *peinlich*

Naja, jedenfalls werde ich dann wohl zu dem Zähler ala markusj greifen... :stupid:

Chris

markusj 24. Feb 2007 08:30

Re: Ist Komponente (TThread) freigegeben?
 
Wenn du auf den Zähler _nur_ über eine Prozedur/Funktion zugreifst (Thread ruft Prozedur/Funktion die _nicht_ ihm gehört auf), kannst du sogar auf das Erreichen des Zustandes 0-Threads bzw. x-Threads reagieren, indem diese Funktion den neuen Variablenwert automatisch prüft und dann den Hauptthread informiert.
=> Aufruf der Prozedur/Funktion über Synchronize.

mfG
Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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