AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

Ein Thema von moelski · begonnen am 18. Sep 2010 · letzter Beitrag vom 16. Nov 2016
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 
Benmik

Registriert seit: 11. Apr 2009
445 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 22:57
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?
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#12

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 22:59
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?
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 23:12
Oder, wenn das Auslagern auf die Festplatte wirklich zu langsam sein sollte, einfach die Größe der Bitmaps ermitteln und nach oben hin deckeln?
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
445 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 23:15
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?!
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#15

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 23:22
Zitat:
Aber Gottsakra, warum funktioniert denn die Speichermessung nicht?!
Funktioniert mein kopierter Code nicht?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 23:44
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 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 TBitmap frei und wiederholst die Aktionen zum Anzeigen des neuen Bildes. Soll nun eines der vorherigen Bilder angezeigt werden, lädst du das 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. EOutOfMemory Exceptions wären damit auf jeden Fall Geschichte.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
445 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 7. Nov 2016, 23:53
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?

Wie wäre es denn hiermit:
Das ist ja interessant! Das werde ich mal ausprobieren.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#18

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 8. Nov 2016, 00:03
Very Large Bitmap Experiment
http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.ZIP
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
445 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 8. Nov 2016, 00:18
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.
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#20

AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert

  Alt 8. Nov 2016, 09:05
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';
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 18:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf