AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Memory Mapped File auslesen; Memory Leak...
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Mapped File auslesen; Memory Leak...

Ein Thema von darkdonald · begonnen am 23. Aug 2008 · letzter Beitrag vom 23. Aug 2008
Antwort Antwort
darkdonald

Registriert seit: 12. Apr 2008
18 Beiträge
 
#1

Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 15:37
Hallo!
Ich hab mal wieder ein kleines Problem. Und zwar möchte ich ein MMF auslesen. Funktioniert auch, allerdings habe ein Memory Leak, also der Speicher läuft langsam aber sicher voll..

Hier der Code:
Delphi-Quellcode:
function ReadMemInfo : Boolean;
var myHandle : Integer;
    TempInfo : PCTInfo;
begin
  myHandle := OpenFileMapping(FILE_MAP_READ, False, 'MyMappingObject');
  if myHandle > 0 then
  begin
    TempInfo := MapViewOfFile(myHandle, FILE_MAP_READ, 0, 0, 0);
    MemInfo := Tempinfo;
    Result := True;
  end else result := false;
  CloseHandle(myHandle);
end;
Ich habe es schon mit "UnMapViewOfFile(TempInfo)" versucht, allerdings bekomme ich dann eine Zugriffsverletzung...

Gruss
Donald

PS: Das ganze wird einmal pro Sekunde aufgerufen...
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 15:48
Hallo.

Ich hatte mich mit MemLeaks schon oftmals beschäftigt, als ich VCLs von Bugs befreit hatte.

Du verwendest sicherlich das Programm MemProof. Dieses müsste dir eigentlich anzeigen, was im Speicher verbleibt (welcher Typ, welche Größe)?

Ich würde als erstes mal für den Handle einen Ressourcenschutzblock try-finally-end empfehlen. Im Notfall müsstest du mit FreeMem() die einzelnen Variablen vor Prozedurende separat freigeben.

Ich weiß leider nicht, was die Variable MemInfo ist und wo diese gelagert ist.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
darkdonald

Registriert seit: 12. Apr 2008
18 Beiträge
 
#3

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 15:57
Die Variable MemInfo ist ein einfacher Record:

Delphi-Quellcode:
  TCTInfo = record
    uiLoad : array [0..255] of Cardinal;
    uiTjMax : array [0..127] of Cardinal;
    uiCoreCnt :Cardinal;
    uiCPUCnt :Cardinal;
    fTemp : array [0..255] of single;
    fVID : single;
    fCPUSpeed : single;
    fFSBSpeed : single;
    fMultiplier : single;
    sCPUName : array [0..99] of Char;
    ucFahrenheit : Boolean;
    ucDeltaToTjMax: Boolean;
  end;

  PCTInfo = ^TCTInfo;

Nein, MemInfo kenn ich ned^^ Ich habe es mit dem Standard-Code ReportMemoryLeaksOnShutdown := true; und auch mit ner Trial-Version von EurekaLog versucht. Beide zeigen kein Ergebnis... :/
Werde mir MemInfo mal ziehen und checken...

Das Problem liegt allerdings definitiv am MapViewOfFile. Wenn ich das auskommentiere ist auch das MemoryLeak verschwunden...

Edit: Ups, meinte natürlich MemProof^^
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 16:38
Hallo Donald,

vielleicht verschwindet dein memory leak, wenn du die vorgeschriebene Funktion UnmapViewOfFile() aufrufst, bevor du das Handle freigibst.

Freundliche Grüße
  Mit Zitat antworten Zitat
darkdonald

Registriert seit: 12. Apr 2008
18 Beiträge
 
#5

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 16:40
Naja, wie schon im ersten Post gesagt: Wenn ich UnMapViewOfFile(TempInfo) aufrufe, dann bekomme ich eine Zugriffsverletzung und das Programm wird beendet...
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 16:45
Kenne das Problem .. Wenn ich ein FileMapping erzeuge, dann entsteht ein MemoryLeak, aber ich kann auf das MMF aus anderen Programmen zugreifen.

Rufe ich vor CloseHandle noch UnmapViewOfFile auf, verschwindet zwar das Leak, aber damit gebe ich auch das MMF wieder frei. Wie wäre es, wenn du das Handle erst beim Schließen deines Programmes wieder freigibst und ebenso UnmapViewOfFile erst unmittelbar vor CloseHandle aufrufst.

Gruß Zacherl
  Mit Zitat antworten Zitat
darkdonald

Registriert seit: 12. Apr 2008
18 Beiträge
 
#7

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 16:52
@Zacherl: Das wird nicht funktionieren. Das Prog soll ja jede Sekunde aktuelle Werte aus dem MMF auslesen. Wenn das Handle und der MapViewOfFile erst beim Programmende freigegeben werden, bekomme ich doch auf jeden Fall ein Memory Leak. Weil ja JEDE SEKUNDE MapViewOfFile erneut aufgerufen wird und nicht nur einmal zur Laufzeit...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 16:58
Durch UnmapViewOfFile() wird kein MMF aus dem Hauptspeicher entfernt, dessen Handle mit OpenFileMapping() besorgt wurde. Man muss da auch nichts ausprobieren. Die korrekte Benutzung dieser Technik ist im Windows SDK mit einem Beispiel dokumentiert: Creating Named Shared Memory

Wie sah denn der Code mit dem Aufruf von UnmapViewOfFile() aus?

EDIT: Das MMF wird doch von einem anderen Programm erzeugt, du liest doch nur mit. Dein MMF ist kohärent, du kannst es einfach offen halten.
  Mit Zitat antworten Zitat
darkdonald

Registriert seit: 12. Apr 2008
18 Beiträge
 
#9

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 17:02
Ahhhh!! Problem gelöst... Ich rufe die Funktion jetzt nur noch einmal beim Programmstart auf und schliesse das Handle beim Beenden. Ich hatte gedacht ich müsste das ganze jede Sekunde aufs neue machen... Aber die Werte sind jetzt trotzdem aktuell...

Vielen Dank für die Hilfe!!

Gruss
Donald
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

Re: Memory Mapped File auslesen; Memory Leak...

  Alt 23. Aug 2008, 18:16
Warum hast Du nicht gleich in der Suchfunktion CORETEMP eingegeben?

http://www.delphipraxis.net/internal...light=coretemp

Aber das Problem mit dem MEMORY LEAK stimmt - das ist noch niemandem aufgefallen!
Wahrscheinlich deshalb, weil beim Minimieren des Fensters der "unrechtmäßig" belegte Speicher wieder freigegeben wird...

Danke für Deine Entdeckung!!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 12:41 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