![]() |
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:
Aber das funktioniert leider nicht :cry:
if komponente = nil then...
Weiß jemand Rat? Chris |
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; |
Re: Ist Komponente (TThread) freigegeben?
Hi,
schau mal nach TThread.OnTerminate das ist das Event. Gruss |
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 |
Re: Ist Komponente (TThread) freigegeben?
*PUSH*
Letzter Versuch, ansonsten muss ich die Lösung mit dem Event nehmen... :cry: Chris |
Re: Ist Komponente (TThread) freigegeben?
Setz die Variable auch auf nil, wenn du sie freigibst.
|
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 |
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:
Oder
FreeAndNil(obj);
Delphi-Quellcode:
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.
obj.Free;
obj := nil; |
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:
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.
if DL <> nil then
begin if DL.Suspended then DL.Resume else DL.Suspend; end; 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 |
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 |
Re: Ist Komponente (TThread) freigegeben?
Das ist eine gute Idee!
So werd' ich's machen. Vielen Dank :mrgreen: Chris |
Re: Ist Komponente (TThread) freigegeben?
Zitat:
Zitat:
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. |
Re: Ist Komponente (TThread) freigegeben?
Zitat:
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 |
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 08:30 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