Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert (https://www.delphipraxis.net/154621-speicherlast-des-programms-mittels-getmemorymanagerstate-komischer-wert.html)

Benmik 7. Nov 2016 21:57

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?

Jim Carrey 7. Nov 2016 21:59

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
 
Zitat:

Da biete ich eine Möglichkeit, eine einstellbare Anzahl von Bildern im Speicher vorzuladen, zum Beispiel 5 vor und 2 zurück.
Ach so ok!

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?

Benedikt Magnus 7. Nov 2016 22:12

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?

Benmik 7. Nov 2016 22:15

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?!

Jim Carrey 7. Nov 2016 22:22

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
 
Zitat:

Aber Gottsakra, warum funktioniert denn die Speichermessung nicht?!
Funktioniert mein kopierter Code nicht?

Zacherl 7. Nov 2016 22:44

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
 
Wie wäre es denn hiermit:
Delphi-Quellcode:
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;
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
Delphi-Quellcode:
TBitmap
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
Delphi-Quellcode:
TBitmap
frei und wiederholst die Aktionen zum Anzeigen des neuen Bildes. Soll nun eines der vorherigen Bilder angezeigt werden, lädst du das
Delphi-Quellcode:
TBitmap
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.
Delphi-Quellcode:
EOutOfMemory
Exceptions wären damit auf jeden Fall Geschichte.

Benmik 7. Nov 2016 22:53

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352939)
Funktioniert mein kopierter Code nicht?

Den Code kannte ich schon von diversen stackoverflow-Diskussionen, aber misst der nicht nur den aktuellen Prozess und nicht den Gesamtspeicher, den die komplette Anwendung verbraucht?

Zitat:

Zitat von Zacherl (Beitrag 1352940)
Wie wäre es denn hiermit:

Das ist ja interessant! Das werde ich mal ausprobieren.

t.roller 7. Nov 2016 23:03

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
 
Very Large Bitmap Experiment
http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.ZIP

Benmik 7. Nov 2016 23:18

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.

Bambini 8. Nov 2016 08:05

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
 
Zitat:

Zitat von Benmik (Beitrag 1352942)
Zitat:

Zitat von Jim Carrey (Beitrag 1352939)
Funktioniert mein kopierter Code nicht?

Den Code kannte ich schon von diversen stackoverflow-Diskussionen, aber misst der nicht nur den aktuellen Prozess und nicht den Gesamtspeicher, den die komplette Anwendung verbraucht?

Dann fragt doch beim FastMM4 Memory Manager nach, wie viel deine Anwendung gerade verwendet:
Delphi-Quellcode:
var
  LMem : TMemoryManagerUsageSummary;
begin
  GetMemoryManagerUsageSummary(LMem);
  Caption := LMem.AllocatedBytes.ToString + ' Bytes';


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.
Seite 2 von 5     12 34     Letzte »    

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