AGB  ·  Datenschutz  ·  Impressum  







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

Ist Komponente (TThread) freigegeben?

Ein Thema von CK_CK · begonnen am 21. Feb 2007 · letzter Beitrag vom 24. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#1

Ist Komponente (TThread) freigegeben?

  Alt 21. Feb 2007, 21:21
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:if komponente = nil then... Aber das funktioniert leider nicht

Weiß jemand Rat?

Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Ist Komponente (TThread) freigegeben?

  Alt 21. Feb 2007, 21:39
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;
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

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

Re: Ist Komponente (TThread) freigegeben?

  Alt 21. Feb 2007, 22:00
Hi,

schau mal nach TThread.OnTerminate

das ist das Event.

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

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Ist Komponente (TThread) freigegeben?

  Alt 21. Feb 2007, 22:09
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...

Einen schönen Abend noch,
Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Ist Komponente (TThread) freigegeben?

  Alt 23. Feb 2007, 15:32
*PUSH*
Letzter Versuch, ansonsten muss ich die Lösung mit dem Event nehmen...

Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Ist Komponente (TThread) freigegeben?

  Alt 23. Feb 2007, 15:34
Setz die Variable auch auf nil, wenn du sie freigibst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Ist Komponente (TThread) freigegeben?

  Alt 23. Feb 2007, 16:07
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?

Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Ist Komponente (TThread) freigegeben?

  Alt 23. Feb 2007, 16:12
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.

  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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Ist Komponente (TThread) freigegeben?

  Alt 23. Feb 2007, 16:22
Oh, entschuldigung

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
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#10

Re: Ist Komponente (TThread) freigegeben?

  Alt 23. Feb 2007, 17:32
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
Markus
  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 06:55 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