Programmgröße im Speicher
-
Hallo,
Hier ein Beispielcode:
PROCESS_MEMORY_COUNTERS pmc; HANDLE hProcess; DWORD processID; processID = GetCurrentProcessId(); hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, processID); GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)); CloseHandle(hProcess);Die Größe deines Programms im RAM ist dann in pmc.WorkingSetSize gespeichert.
MfG, Jochen
-
Wobei sich die Working-Set-Size dauernd ändert, wird dynamisch angepasst danach wieviel des angeforderten/zugeteilten (virtuellen) Speichers das Programm gerade aktiv verwendet, und natürlich danach wie viel Speicher andere Programme gerade brauchen.
Das entspricht zwar genau der Fragestellung von freak4fun, weiss aber nicht ob es auch das ist was er rausbekommen will

-
Werte "PrivateBytes" aus... (oder auch PageFileUsage genannt).
-
Hallo,
ich danke euch allen erstmal für die rege Beteiligung.
Ich habe nun folgendes:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int* Bytes; ULongToInt( pmc.WorkingSetSize, Bytes); ShowMessage( IntToStr( *Bytes));Ich habe hier den C++-Builder 2010. Das Handle entspricht dem HANDLE hProcess. Da die Werte auch die gleichen sind (beim debuggen verglichen), denke ich das geht so ok. Allerdings bekomme ich eine Exception bei:
GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc));---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 7551AA67 in Modul 'KERNELBASE.dll'. Schreiben von Adresse 00000028.
---------------------------
OK
---------------------------Was mache ich falsch?

Ich habe für die psapi.dll eine psapi.lib erstellt und die psapi.h, psapi.dll und psapi.lib in mein Projekt eingebunden.
-
Du hast dem Zeiger Byte keine gültige Adresse zugewiesen, er ist also undefiniert. Greifst du nun über diesen Zeiger auf den Speicher zu, führt das zu einem Fehler. Hier noch zwei verbesserte Versionen:
Version 1:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int* Bytes = new int; ULongToInt( pmc.WorkingSetSize, Bytes); ShowMessage( IntToStr( *Bytes)); delete Bytes; Bytes = NULL;Version 2:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int Bytes; ULongToInt( pmc.WorkingSetSize, &Bytes); ShowMessage( IntToStr( Bytes));Ich würde allerdings die 2. Version vorziehen, da sie meiner Meinung nach weniger fehleranfällig ist.
MfG, Jochen
-
Die 2. Version ist klasse.

Ich bekomme als Ergebnis:
[Window Title]
Project1[Content]
2005905114[OK]
Der Taskmanager zeigt an im Gegensatz 2.616 [KB] zu meinen 2.005 [KB] an. Wie kommt das nun schon wieder? Etwas geht für das ShowMessage (2.308 [KB]) drauf, aber der Rest?
-
Hallo,
Versuch mal, den Wert PagefileUsage anstatt workingSetSize auszuwerten:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int Bytes; ULongToInt( pmc.PagefileUsage, &Bytes); ShowMessage( IntToStr( Bytes));Das wäre dann das, was Jochen Kalmbach vorgeschlagen hat.
MfG, Jochen
-
PagefileUsage und WorkingSetSize liefern mir das gleiche Ergebnis.

-
Zufall... minimiere mal Deine Anwendung und lese die Werte dann nochmals aus

-
Jochen Kalmbach schrieb:
Zufall... minimiere mal Deine Anwendung und lese die Werte dann nochmals aus

Ich habe ein Leeres Projekt mit Button. Da ist net viel zu minimieren.

Ich werd mir das aber weiter anschauen und testen.