![]() |
Wie starte ich abgelaufenen Thread erneut?
Hallo,
hier wieder eine Anfängerfrage zum Thema Threads. Ich habe ein Threadobjekt definiert, das ich so starte:
Delphi-Quellcode:
Nach meinem Verständnis wird hierbei die Threaddatenstruktur in der Variable Capture angelegt und der Thread beginnt zu arbeiten bis er fertig ist. Danach sind nach meinem Verständnis die Daten und Methoden des Threads aber immernoch da, d.h. ich müsste doch meinen Capture-thread einfach wieder erneut starten können.
Capture := TCapture.Create(false)
Gibt es also sowas wie TThread.Machsnochmal oder muss ich Capture.Free machen und dann erneut die Datenstrukturen mit Capture.Create anlegen? Gruß, Thomas |
Re: Wie starte ich abgelaufenen Thread erneut?
Kurz und knapp: Das ist dann ein anderer Thread. Ein Mensch lebt auch nicht zweimal. :wink: Und ein TThread-Objekt kapselt auch nur einen Windows-Thread.
|
Re: Wie starte ich abgelaufenen Thread erneut?
Was heißt das in Delphicode?
Delphi-Quellcode:
?
//machs nochmal
Capture.Free; Capture.Create(false); |
Re: Wie starte ich abgelaufenen Thread erneut?
Delphi-Quellcode:
Capture := TCapture.Create(false);
|
Re: Wie starte ich abgelaufenen Thread erneut?
Ok.
Noch ne dumme Frage: Wozu braucht man dann den Thread-Destruktor Free? |
Re: Wie starte ich abgelaufenen Thread erneut?
Free ist kein Destruktor, sondern eine normale Procedure, welche verschiedene Überprüfungen durchführ und dann den eigentlich Destruktr aufruft.
Ohne ihn, würde die alte Struktur im Speicher bleiben |
Re: Wie starte ich abgelaufenen Thread erneut?
Dann muss ich also vor
Delphi-Quellcode:
auf jeden Fall
Capture := TCapture.Create(false);
Delphi-Quellcode:
aufrufen, weil ich andernfalls ein Speicherleck programmiere?
Capture.Free;
|
Re: Wie starte ich abgelaufenen Thread erneut?
Ja. Es wird neuer Speicher angefordert, auf den die Referenz(Zeiger) dann gesetzt wird.
|
Re: Wie starte ich abgelaufenen Thread erneut?
Noch eine Frage:
Warum verändert dann Free den genutzten Prozessspeicher nicht? Ich hätte erwartet, dass beim Entladen des abgelaufenen Threadobjekts Speicher freigegeben wird. |
Re: Wie starte ich abgelaufenen Thread erneut?
Free selber ruft nur den Destruktor auf, dessen Aufgabe ist es den Speicher freizugeben. Wie sieht dieser aus?
|
Re: Wie starte ich abgelaufenen Thread erneut?
1. Wenn man die TThread-Property "FreeOnTerminate" setzt, solltest du tunlichst kein Free mehr selbst aufrufen, da das ein Griff in's Leere wäre. Das kanonische "ja" von mkinzler ist also u.U. mit Vorsicht zu genießen.
2. Der Delphi-Speichermanager gibt einmal reservierten Speicher nicht immer umgehend an Windows zurück, sondern hält Bereiche zum schnellen "Neu"-reservieren vor. Das heisst, dass du z.B. im Taskmanager nicht zwangsweise eine Änderung siehst wenn du etwas freigegeben hast. |
Re: Wie starte ich abgelaufenen Thread erneut?
Ein Aufruf von Free, sollte aber nicht schaden. Zudem wäre es bei einem Fehler im Destruktor egal, wie er aufgerufen wird
|
Re: Wie starte ich abgelaufenen Thread erneut?
Ich habe keinen eigenen Destruktor, nur den ererbten von TThread.
Ich benutze nicht FreeOnTerminate, da ich die Speichereffekte sehen will. Ich frage den Prozessspeicher im Programm ab, nicht im Taskmanager. Dabei fiel mir auf, dass mit jedem Öffnen eines Unterfensters (mit Fenster.Visible:=true) der Prozessspeicher vergrößert wird, beim Schließen aber nicht wieder verkleinert wird. Das scheint dann wohl die Reserviererei zu sein. |
Re: Wie starte ich abgelaufenen Thread erneut?
Alles was du selber anlegst, musst du auch selber Freigeben.
|
Re: Wie starte ich abgelaufenen Thread erneut?
Guten Abend,
wieso schickst Du den Thread nicht in den Ruhezustand und weckst ihn wieder wenn Du ihn wieder benötigst. Grüße Klaus |
Re: Wie starte ich abgelaufenen Thread erneut?
Zitat:
@Destruktor: Wenn du in deinem Threadobjekt von irgendetwas Instanzen erzeugst, musst du diese auch immer selbst freigeben - das tut TThread nicht für dich. Das mit den Fenstern ist nochmal etwas komplizierter. Da wurschtelt Windows selbst auch noch etwas mit den Ressourcen herum, und das auch nicht immer 100%ig nachvollziehbar. Es kann z.B. auch mal sein, dass sich der verwendete Speicher eines Programmes extrem verkleinert, wenn sein Fenster minimiert wird. Wenn du versuchst auf diese Weise Lecks zu finden, freunde dich lieber mit einem Profiler an - die können das meist erheeeeblich akkurater. Bei der reinen Speichernutzung spielen zu viele weitere Faktoren mit um qualitative Aussagen machen zu können, vor allem wenn es nur um ein paar popelige Bytes eines TThreads geht. Das geht im sonstigen "Rauschen" total unter. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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