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 Alternative zu Application.Minimize für RAM-Freigabe (https://www.delphipraxis.net/57722-alternative-zu-application-minimize-fuer-ram-freigabe.html)

Nogge 25. Nov 2005 15:03


Alternative zu Application.Minimize für RAM-Freigabe
 
Hallo Community,
Ich verwalte das Minimieren von Forms immer selbst, da ich u.a. mit der TNA arbeite und dafür die Form verstecken muss.
Delphi-Quellcode:
procedure TForm2.proc_WM_SysCommand(var Msg: TWMSysCommand);
begin
  if ( (Msg.CmdType and $FFF0) = SC_MINIMIZE ) then
  begin
    { -- Speicher freigeben -- }
    Application.Minimize;
    // hier wird beim ersten Minimieren kurz die TaskBar angezeigt ;_;
    { -- TaskBar-Eintrag entfernen -- }
    ShowWindow(Application.Handle,SW_HIDE);
    { -- Form verstecken -- }
    self.Hide;
  end else
    inherited;
end;
Dabei verwende ich vorher Application.Minimize, um Speicher beim Minimieren freizugeben, was mit einem einfachen Hide-Befehl nicht geschiet. Ich würde jetzt gern wissen, warum Windows den Speicher beim Minimieren freigibt und ob es eine Alternative zum Freigeben von RAM beim Minimieren gibt. Mein Grund für diese Frage ist in meinem Kommentar im Delphi-Code enthalten.

Bitte um Hilfe. Nogge

xaromz 25. Nov 2005 15:08

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Hallo,

seit wann gibt Application.Minimize Speicher frei? Damit wird doch nur die Anwendung minimiert. Dabei werden wahrscheinlich ein paar Ressourcen freigegeben, aber das macht dann Windows, und zwar automatisch beim Minimieren.

Gruß
xaromz

Bernhard Geyer 25. Nov 2005 15:09

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Zitat:

Zitat von Nogge
Dabei verwende ich vorher Application.Minimize, um Speicher beim Minimieren freizugeben, was mit einem einfachen Hide-Befehl nicht geschiet. Ich würde jetzt gern wissen, warum Windows den Speicher beim Minimieren freigibt und ob es eine Alternative zum Freigeben von RAM beim Minimieren gibt.

Welche Spalte im Taskmanager läßt dich dazu verleiden anzunehmen das Speicher freigegeben wird?

Nogge 25. Nov 2005 15:10

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Schau es Dir im TaskManager unter Speicherauslastung an. Wenn Du Dein Programm zum ersten mal regulär minimierst, wird ziemlich viel Speicher freigegeben.

RavenIV 25. Nov 2005 15:14

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Zitat:

Zitat von Nogge
Schau es Dir im TaskManager unter Speicherauslastung an. Wenn Du Dein Programm zum ersten mal regulär minimierst, wird ziemlich viel Speicher freigegeben.

das halte ich für ein Gerücht.
Evtl. zeigt auch der Taskmanager "irgendwas" an...

Nogge 25. Nov 2005 15:17

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Äh, fürs Anzeigen von "Irgendetwas" wurde der TaskManager bestimmt nicht konzipiert...

Aenogym 25. Nov 2005 15:21

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von Nogge
Schau es Dir im TaskManager unter Speicherauslastung an. Wenn Du Dein Programm zum ersten mal regulär minimierst, wird ziemlich viel Speicher freigegeben.

das halte ich für ein Gerücht.
Evtl. zeigt auch der Taskmanager "irgendwas" an...

was meinst du mit "irgendwas"? also ich denke, dem taskmanager sollte man schon vertrauen können.

ich habe ein ähnliches problem. mein programm lädt zum start einige sounds mithilfe der bass.dll (um die sounds später quasi ohne große zeitverzögerung wiederzugeben).
wenn die anwendung startet, hat sie -lass mich lügen:- 2000K belegt, laut taskmanager. dann werden die sounds geladen und schwupps sind 8000K belegt. wenn ich jetzt minimiere, sind's nur noch etwa 1000K. nach dme wiederherstellen dann etwa 1200K.
das programm läuft wie geschmiert, es kommt nicht wieder auf die 8000K speicher.

wenn ich aber nach dem wiederherstellen weitere sounds reinlade, dann steigt der speicherverbrauch wieder an.

mich würde auch interessieren, wie man ohne zu minimieren den speicherverbrauch so reduzieren kann.

aenogym

jim_raynor 25. Nov 2005 16:09

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Könnte es vielleicht sein, dass der Taskmanager den physisch verbrauchen Arbeitsspeicher anzeigt. Heisst ausgelagerter Speicher wird dort nicht berücksichtigt.

Es gibt noch eine weitere Spalte "Virtueller Speicher". Die dürfte beim Speicherverbrauch interessanter sein. Und wenn du mal in die Hilfe des Taskmanager schaust, dann steht da:

Zitat:

Zitat von Taskmanager-Hilfe
Speichernutzung
Im Task-Manager die aktuellen Arbeitsseiten eines Prozesses (in Kilobytes). Die aktuellen Arbeitsseiten bestehen aus der Anzahl der derzeit speicherresidenten Seiten. Auf der Registerkarte Prozesse des Task-Managers lautet die Spaltenüberschrift Speichernutzung.
Siehe auch: Task-Manager

Heisst für mich die wirklich im Arbeitsspeicher gebraucht werden. Nicht das was ausgelagert ist.

Daniel Schuhmann 25. Nov 2005 16:13

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Windows gibt den Speicher nicht frei, sondern lagert ihn auf die Pagefile aus. Das bekommt man aber nur zusehen, wenn man die Spalten auch anzeigt.

http://www.fahrpult.de/icq/taskman.gif
Habs leider nur grad auf englisch, sorry. Option heißt Ansicht/Spalten auswählen und dann Virtueller Speicher oder so.

Für genauere Analysen kann ich nur den Prozess-Explorer empfehlen.

Daniel

Nogge 26. Nov 2005 01:23

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Nach meinen bisherigen Studien bin ich nicht der Meinung Daniels. Windows gibt wirklich den in der Spalte "Mem Usage" angegebenen Speicher teilweise frei, da sich der virtuelle Speicher während des Minimierens (und somit während des Freigebens von Speicher) nicht erhöht.

jim_raynor 26. Nov 2005 08:39

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Zitat:

Zitat von Nogge
Nach meinen bisherigen Studien bin ich nicht der Meinung Daniels. Windows gibt wirklich den in der Spalte "Mem Usage" angegebenen Speicher teilweise frei, da sich der virtuelle Speicher während des Minimierens (und somit während des Freigebens von Speicher) nicht erhöht.

Der Virtuelle Speicher gibt ja auch den gesamten von der Anwendung benötigten Speicher an, nicht den der gerade ausgelagert ist. Also Speicherverauch+ausgelagerter Speicher = Virtueller Speicher.

Nogge 26. Nov 2005 09:31

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Mit Speicherverbrauch meinste "Mem Usage"? Wenn ja, dann stimmt Deine Aussage auch nicht, da sich der virtuelle Speicher ja verringern müsste, wenn er sich aus dem verkleinerten "Mem Usage" zusammensetzt.

Daniel Schuhmann 26. Nov 2005 09:53

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Zitat:

Zitat von Nogge
Nach meinen bisherigen Studien bin ich nicht der Meinung Daniels. Windows gibt wirklich den in der Spalte "Mem Usage" angegebenen Speicher teilweise frei, da sich der virtuelle Speicher während des Minimierens (und somit während des Freigebens von Speicher) nicht erhöht.

Lad Dir mal den erwähnten Process-Explorer herunter und schau da den Speicherbedarf an.


Ich habe über einen Zeitraum von knapp zwei Minuten Notepad ständig minimiert und wiederhergestellt. Im Performance Graph lässt sich das aber nicht feststellen - der reservierte Speicher bleibt immer der selbe:

http://www.smartcoder.net/de/images/...es_history.gif
Anzeige der Private Bytes im Performance Graph


Der Speicherbedarf von Notepad direkt nach dem Start. Die Private Bytes liegen bereits bei 852 KB, das Working Set (der Wert, den der Taskmanager anzeigt), liegt bei 2,3 MB, da hier sämtliche DLLs-Funktionen (Änderung der Schriftgröße, Suchen/Ersetzen usw.) geladen wurden.

http://www.smartcoder.net/de/images/...ad_started.gif
Speicherbedarf von Notepad nach dem Start


Notepad wurde minimiert. Die Private Bytes liegen noch immer bei 852 KB. Das Working Set ist nun allerdings auf 232 KB reduziert, weil der von Windows als nicht notwendig erachtete Krempel ausgelagert wird. Der Peak-Wert steht natürlich noch auf dem Maximalwert von 2,3 MB.

http://www.smartcoder.net/de/images/..._minimized.gif
Notepad wurde minimiert


Das Fenster von Notepad ist nun wiederhergestellt. Das Working Set liegt bei 436 KB - Windows erkennt, daß der Speicher zum refreshen des Edit-Fensters nötig ist. Werden einige Zeichen getippt, erhöht sich das Working Set nochmals um etwa 100 KB. Der Wert der Private Bytes liegt noch immer bei 852 KB.

http://www.smartcoder.net/de/images/...d_restored.gif
Programmfenster ist Wiederhergestellt


Es werden ein paar Dialoge geöffnet und wieder geschlossen. Das Working Set steigt abermals und erstmalig erhöht sich auch der direkt in Private Bytes genutzte Speicher, wovon aber der meiste beim Schließen der Dialoge freigegeben wird. Den Maximalwert kann man noch an der Größe der Peak Private Bytes erkennen.

http://www.smartcoder.net/de/images/...ad_dialogs.gif
Dialoge wurden geöffnet und wieder geschlossen

Daniel

Nogge 26. Nov 2005 10:20

Re: Alternative zu Application.Minimize für RAM-Freigabe
 
Ich hatte mir das Programm bereits heruntergeladen, konnte jedoch nicht allzu viel damit anfangen. VIELEN DANK für die Mühe, Daniel Schuhmann! Ich denke, ich habe es jetzt verstanden. Private Bytes geben mir also die eigentliche Speichernutzung meines Programms an, richtig?


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