Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memory Mapped File auslesen; Memory Leak... (https://www.delphipraxis.net/119275-memory-mapped-file-auslesen%3B-memory-leak.html)

darkdonald 23. Aug 2008 14:37


Memory Mapped File auslesen; Memory Leak...
 
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...

blackdrake 23. Aug 2008 14:48

Re: Memory Mapped File auslesen; Memory Leak...
 
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

darkdonald 23. Aug 2008 14:57

Re: Memory Mapped File auslesen; Memory Leak...
 
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
Delphi-Quellcode:
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^^

marabu 23. Aug 2008 15:38

Re: Memory Mapped File auslesen; Memory Leak...
 
Hallo Donald,

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

Freundliche Grüße

darkdonald 23. Aug 2008 15:40

Re: Memory Mapped File auslesen; Memory Leak...
 
Naja, wie schon im ersten Post gesagt: Wenn ich UnMapViewOfFile(TempInfo) aufrufe, dann bekomme ich eine Zugriffsverletzung und das Programm wird beendet...

Zacherl 23. Aug 2008 15:45

Re: Memory Mapped File auslesen; Memory Leak...
 
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

darkdonald 23. Aug 2008 15:52

Re: Memory Mapped File auslesen; Memory Leak...
 
@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...

marabu 23. Aug 2008 15:58

Re: Memory Mapped File auslesen; Memory Leak...
 
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.

darkdonald 23. Aug 2008 16:02

Re: Memory Mapped File auslesen; Memory Leak...
 
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

hathor 23. Aug 2008 17:16

Re: Memory Mapped File auslesen; Memory Leak...
 
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!!!


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