AW: Aufräumarbeiten bei Anwendungsende
Vielleicht lässt sich der Speicherbereich, der hier anscheinend so viel Zeit in Anspruch nimmt, um bereinigt zu werden, anders organisieren??? Da müsste man nur wissen worum es geht?
|
AW: Aufräumarbeiten bei Anwendungsende
Ist halt recht schwer einzuschätzen ohne genaueres zu wissen. Generell bin ich auch jemand der alles schön aufgeräumt haben will.
In der Praxis hat Raymond denke ich mal (evtl. Sonderfälle ggf. ausgeschlossen) Recht. Wenn der einzige Code der deine Anwendung noch ausführen wird bis zum endgültigen Ende das Freigeben von Speicher etc ist, dann kann man sich diesen Code sparen. Ich hatte wie die meisten anderen hier auch noch nie das Problem, dass das Aufräumen so lange gebraucht hat, dass ich nicht-Aufräumen in Betracht ziehen musste. Ich würde es wahrscheinlich mal probieren. Wenn der Geschwindigkeitsgewinn sehr groß wäre, dann würde ich es in Betracht ziehen. Andererseits wäre für mich dann auch noch die Frage ob der Benutzer überhaupt (noch) etwas von der Anwendung sieht wenn diese aufräumt oder ob dann schon alle Formulare etc geschlossen sind. Wenn das einzig sichtbare beim Aufräumen der Eintrag im Taskmanager ist, dann wird sich der User daran sicher nicht stören, denn für ihn ist das Programm aus, wenn er nichts mehr davon sieht. Aber ist wahrscheinlich größtenteils ne Glaubensfrage, genauso wie ob man FreeAndNil bei lokalen Variablen benutzt oder nicht - Es nutzt rein gar nichts, aber für manche fühlt es sich sauberer an. |
AW: Aufräumarbeiten bei Anwendungsende
Tatsächlich hatte ich einmal eine Baumstruktur mit einigen tausend Nodes, für die alle eine Klasseninstanz im RAM residierte. Dieser Baum war recht kompliziert aufzuspannen und dementsprechend rechenintensiv war das Hinzufügen, aber auch Entfernen der Nodes (hatte kaskadierende Events mit Neuberechnungen zu Folge). Bei dieser Anwendung ist mir dann auch aufgefallen, dass das Aufräumen am Ende noch mehrere Sekunden angedauert hat. Beim Debuggen merkt man das ja recht schön, wenn zwischen dem Klick auf X und dem Umschalten auf Designtime Oberfläche in Delphi einige Zeit vergeht.
Habe mir dann auch so beholfen, dass die Klasse im
Delphi-Quellcode:
ein Flag setzt, was alle Neuberechnungen auf Eis gelegt hat und dann einfach sämtliche Nodes in einer Schleife freigibt und danach die Index-Liste löscht (
destructor
Delphi-Quellcode:
bzw.
TList.Remove
Delphi-Quellcode:
wurde mir tatsächlich hier auch zum Flaschenhals, da die Nodes sich im Normalfall selbst (de-)registriert haben).
TList.IndexOf
Das hat mir schon einen deutlichen Geschwindigkeitsboost gebracht. Hatte dann zeitweise noch überlegt
Delphi-Quellcode:
für meine Nodes zu überschreiben, damit ich einfach einen großen zusammenhängenden Speicherblock reservieren - und am Ende in einem Rutsch freigeben - kann. Die Idee habe ich allerdings wieder verworfen. Unter 64-Bit wäre das zwar kein Problem gewesen, da die Node-Klasse auch nicht sonderlich groß war, allerdings bestand sie aus einer Komposition mehrerer anderer Klassen, für die ich konsequenterweise das Spielchen dann auch hätte weitertreiben müssen.
InitInstance
|
AW: Aufräumarbeiten bei Anwendungsende
Zitat:
|
AW: Aufräumarbeiten bei Anwendungsende
Zitat:
Zitat:
Oder willst Du ein globales Flag Shutdown: Boolean einführen und in jedem destructor prüfen ob das gesetzt ist? :wink: |
AW: Aufräumarbeiten bei Anwendungsende
Zitat:
Delphi-Quellcode:
Aber so direkt in Komponenten sollte man es dann doch nicht verwenden, denn
Application.Terminated
* in einer Service-Anwendung kommt "Application" nicht aus der Unit Forms, sondern aus SvcMgr * im FMX ist es FMX.Forms statt VCL.Forms * In einem Thread wäre es
Delphi-Quellcode:
, falls der Thread in der RTL gekapselt wäre,
Self.Terminated
und außerhalb der Threadklasse könnte man auf die Idee kommen
Delphi-Quellcode:
zu nehmen, was aber nicht funktioniert, da CurrentThread eine "eigene" Klasseninstanz nutzt und der Terminated-Flag nicht durchgereicht wird.
TThread.CurrentThread.Terminated
* ... und für eine Komponente/Unit ist beim Kompilieren aber nicht ersichtlich, wo sie verwendet wird. |
AW: Aufräumarbeiten bei Anwendungsende
Zitat:
Delphi-Quellcode:
/
BeginUpdate
Delphi-Quellcode:
Funktionalität sowieso zwingend notwendig.
EndUpdate
|
AW: Aufräumarbeiten bei Anwendungsende
Zitat:
Im Rahmen der ganzen Telemtrie-Dinger dürfte MS dann auch merken, dass das Programm häufiger "nicht ordnungsgemäß" funktioniert. Wer weiß, wo das irgendwann schaden kann? Gibt ja zum Beispiel bei Windows Upgrades immer mal wieder Programme, die wegen "Inkompatibilität" mehr oder weniger still entfernt werden. Das Risiko, mit so einem nicht regelkonformen Verhalten irgendwann auf dem falschen Index zu landen, wäre mir zu groß. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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