![]() |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Nein, nein, das hat schon seine Richtigkeit. Es geht um ein Bildanzeigeprogramm. Da biete ich eine Möglichkeit, eine einstellbare Anzahl von Bildern im Speicher vorzuladen, zum Beispiel 5 vor und 2 zurück. Man kann dann auch bei langsamer Verbindung sehr schnell innerhalb dieser 7 Bilder hin- und herspringen, weil sie nicht jedesmal geladen und dekodiert werden müssen. 7 Bitmaps sind schon eine Menge Stoff, das kann locker an 500 MB herangehen. Ein EOutOfMemory gibt es, wenn a) die Anzahl zu hoch eingestellt wird, b) die Bitmaps sehr groß sind. Wenn da ein Panoramabild dabei ist, dann kann es schon bei einer Bitmap knallen.
Das Abfangen von EOutOfMemory funktioniert leider nicht immer, ich vermute, weil da Funktionen aus einer DLL aufgerufen werden, und deren Fehlermeldungen nicht unterdrückt werden können. Hab ich aber noch nicht ganz exakt untersucht, weil ich es lieber gesehen hätte, zum Beispiel bei 1,5 GB das Laden abbrechen zu können bzw. gar nicht erst zu versuchen. Das sollte doch eigentlich mit GetMemoryManagerState möglich sein. Daneben verstehe ich auch nicht: Wie kann die Berechnung um den Faktor 100 daneben liegen? |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Da fällt mir spontan ein, wie es Photoshop doch macht. Da werden die Bilder (Tabs) auf die Festplatte ausgelagert). Wäre das eine Möglichkeit für dich von der Schnelligkeit her? |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Oder, wenn das Auslagern auf die Festplatte wirklich zu langsam sein sollte, einfach die Größe der Bitmaps ermitteln und nach oben hin deckeln?
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Auf keinen Fall. Die Bilder können ja auch auf einem unglaublich langsamen Netzlaufwerk liegen (ich spreche da aus eigener Erfahrung). Außerdem funktioniert das mit dem Speicher ganz ausgezeichnet. Es handelt sich ja nur um ein Grenz-Problem.
Deckeln: Ja, aber das hängt ja vom Speicher ab... Obwohl, könnte ich als Notnagel natürlich auch machen... Aber Gottsakra, warum funktioniert denn die Speichermessung nicht?! |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Wie wäre es denn hiermit:
Delphi-Quellcode:
Du zeigst ja immer nur ein Bild gleichzeitig an, so wie ich das verstanden habe. Dieses Bild lädst du von seinem originalen Speicherort, decodierst es ggfls., so dass du die Bilddaten als
type
TMemoryFileStream = class(THandleStream) public constructor Create; destructor Destroy; override; end; { TMemoryFileStream } constructor TMemoryFileStream .Create; begin inherited Create(CreateFile(PChar(TPath.GetTempFileName), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY or FILE_ATTRIBUTE_NOT_CONTENT_INDEXED or FILE_ATTRIBUTE_HIDDEN or FILE_FLAG_DELETE_ON_CLOSE, 0)); end; destructor TMemoryFileStream .Destroy; begin if (FHandle <> INVALID_HANDLE_VALUE) then begin FileClose(FHandle); end; inherited Destroy; end;
Delphi-Quellcode:
vorliegen hast und zeigst es dann an. Sobald der User jetzt das nächste Bild anzeigen will, speicherst du das aktuelle Bild mit der von mir geposteten Stream-Klasse, gibst das
TBitmap
Delphi-Quellcode:
frei und wiederholst die Aktionen zum Anzeigen des neuen Bildes. Soll nun eines der vorherigen Bilder angezeigt werden, lädst du das
TBitmap
Delphi-Quellcode:
einfach wieder aus dem Stream. Diese Stream-Klasse ist ziemlich performant, da sie den Windows File-Cache verwendet. Es sieht zwar so aus, als ob die Daten in einer temporären Datei gespeichert werden, aber so lange Windows global genug freien RAM zur Verfügung stehen hat, bleiben die Daten dort im Cache. Zugriffe auf die Festplatte hast du so also im Optimalfall gar nicht und als Bonus managed Windows den kompletten Speicher für dich.
TBitmap
Delphi-Quellcode:
Exceptions wären damit auf jeden Fall Geschichte.
EOutOfMemory
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Zitat:
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Süß! Windows 95! Delphi 3! Toll!
Aber auch die maximale Größe, die das Programm annimmt, zwingt mein System nicht in die Knie. Projekt öffnen und modifizieren habe ich mir allerdings gespart. |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Delphi-Quellcode:
var
LMem : TMemoryManagerUsageSummary; begin GetMemoryManagerUsageSummary(LMem); Caption := LMem.AllocatedBytes.ToString + ' Bytes'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 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 by Thomas Breitkreuz