Freien Speicher ermitteln
-
Ich hab das damals so gelöst bzw abgeschaut

// freier speicher wird ermittelt for(drv='C';drv<='Z';++drv){ char adr1[500]; sprintf(adr1,"%c:\\",drv);//Laufwerksbuchstabenanpassung für die Funktionen if(GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes) != NULL){ if ((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)>0){ DirPRO= (int)Int64ShrlMod32(TotalNumberOfBytes.QuadPart,20)/100; //ermittlung eines Prozents des Gesammtspeichers DirFREIPRO=(int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)/DirPRO; //Prozent freier Speicher sprintf(DirGESAMT,"Gesamt: %iMB",(int)Int64ShrlMod32(TotalNumberOfBytes.QuadPart,20)); // gesamter Speicher sprintf(DirFREI,"Frei: %iMB",(int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)); // freier speicher u_respond(u,"14%c:\\ %s %s -- %i%% frei", drv, DirGESAMT, DirFREI, DirFREIPRO); } } }ein Nachteil ist das Laufwerke die 0Byte freien Speicher haben durch die if Abfrage nicht angezeigt werden.
aber vielleicht hilft das ja trotzdem

mfg c°h°
-
Hallo,
Du ermittelst den Festplatten Speicher, ich möchte aber den Ramspeicher Platz ermitteln.
Meine Lösung mit dem Borland Builder.
void __fastcall TForm1::Timer1Timer(TObject *Sender) { _MEMORYSTATUS MemStatus; GlobalMemoryStatus(&MemStatus); Label5->Caption = FloatToStrF(((float)MemStatus.dwAvailPhys/1048576),ffFixed,15,1); Label1->Caption = FloatToStrF(((float)MemStatus.dwAvailPhys/1024),ffFixed,15,1); Label3->Caption = MemStatus.dwAvailPhys; }Ich habe mir die Mühe gemacht da einige Applicationen von mir irgendwie
den Speicher langsam wegfressen.Jemand nie Idee wie das passieren kann?
-
hermes schrieb:
Ich habe mir die Mühe gemacht da einige Applicationen von mir irgendwie
den Speicher langsam wegfressen.Jemand nie Idee wie das passieren kann?
irgendwie ein ungleichgewicht zwischen malloc/free bzw. new/delete oder delete statt delete[] usw....
-
irgendwie ein ungleichgewicht zwischen malloc/free bzw. new/delete oder delete statt delete[] usw....
Nein.
Es handelt sich um eine von mir erstellte grahische Komponente, ich
habe das ganze schon 1000 mal durchgesehen und keine Fehler festgestellt.Irgend eine Idee wie man solch einem Fehler am besten auf die Spur kommt.
-
du könntest z.b. processexplorer verwenden um zu schauen ob du ein gdi-handle leak hast oder n anderes leak...
-
How to get the largest available continues memory block
http://blog.kalmbachnet.de/?postid=9
-
Ist schon erschreckend, habe bei frisch gebootetem Rechner 159 MB frei.
Nach dem Start und beenden einiger Applicationen (Mozilla FireFox, Outlook,
Notepad....) bin ich nun bei 120MB.
Wie gesagt alle Programme sind wieder beendet worden.Sind diese Applicationen alle so schlampig programmiert, oder warum geben sie
denn Speicher nicht mehr frei.
-
Auf was für einen Wert schaust Du denn???
Wenn sich ein Programm beendet dann wird der gesamte Speicher dieses Prozesses freigegen, unabhängig davon ob es schlampig oder gut programmiert wurde...
-
Auf den mit GlobalMemoryStatus(&MemStatus) ermittelten Wert, umgerechnet
auf MB.
-
Und welchen von denen? Hoffentlich nicht "dwAvailPhys", der sagt nämlich gar nichts aus...
-
genau dwAvailPhys.
Welchen sollte ich den da benutzen?
-
Die Frage ist: Was willst Du überhaupt wissen???
-
Ich möchte denn momentan noch verfügbaren Speicher ermitteln, da wie
ich schon erwähnte einige meiner Applicationen den Speicher langsam
aufbrauchen.Das ständig laufende Tool ermittelt einmal pro Sekunde den noch verfügbaren
Speicher und zeigt diesen an.Der angezeigte Wert scheint auch ok zu sein, wenn ich versuche bei nur
noch wenigem Speicher den Borland Builder zu starten kommt die Fehlermeldung
das eine Library nicht mehr geladen werden kann.
-
hermes schrieb:
Ich möchte denn momentan noch verfügbaren Speicher ermitteln, da wie
ich schon erwähnte einige meiner Applicationen den Speicher langsam
aufbrauchen.Dann kümmere Dich doch bitte um den Speicher der einzelnen Applikationen und nicht um den Speicher des OS!!!
Also: "GetProcessMemoryInfo" und hier speziell "PagefileUsage". Das ist das was angibt wie viel Speicher der Prozess braucht. Und wenn es steigt dann hat er ein "Speicherleck".hermes schrieb:
Das ständig laufende Tool ermittelt einmal pro Sekunde den noch verfügbaren Speicher und zeigt diesen an.
Das ist total sinnols... mache es bitte auf Prozess-Ebene, sonst hast Du keine Aussagekräftige Daten!
Also z.B. via "EnumProcesses" und "OpenProcess" und dann die obige Funktion.hermes schrieb:
Der angezeigte Wert scheint auch ok zu sein
Er ist aber nicht aussagekräftig... Du kannst weder sagen, welcher Prozess den Speicher benötigt noch hilft er Dir in irgendeiner Form. Auch steigt der Speicher wieder an, wenn Du alle Fenster minimierst... was ja aber eigentlich an der Speicherauslastung nichts ändert...
-
Danke erstmal für die Tips, werde das ganze mal umsetzen.
Eine Frage noch, wie komme ich an den Handle der Application die ich überwachen
möchte.
-
hermes schrieb:
Eine Frage noch, wie komme ich an den Handle der Application die ich überwachen möchte.
Hab ich doch gesagt

EnumProcesses und OpenProcess...
-
Aus der SDK.
Parameters
dwDesiredAccess
[in] Access to the process object. This access right is checked against the security descriptor for the process. This parameter can be one or more of the process access rights.If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.
bInheritHandle
[in] If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
dwProcessId
[in] Identifier of the process to open.Return Values
If the function succeeds, the return value is an open handle to the specified process.
dwProcessId
[in] Identifier of the process to open.Wo bekomme ich den Parameter her?
-
hermes schrieb:
Wo bekomme ich den Parameter her?
Hat er doch gesagt: EnumProcesses.
-
The EnumProcesses function retrieves the process identifier for each process object in the system.
BOOL EnumProcesses(
DWORD* pProcessIds,
DWORD cb,
DWORD* pBytesReturned
);Parameters
pProcessIds
[out] Pointer to an array that receives the list of process identifiers.
cb
[in] Size of the pProcessIds array, in bytes.
pBytesReturned
[out] Number of bytes returned in the pProcessIds array.Verstehe nur "Bahnhof", hast du mal ein kleines Beispiel?
-
Die mit [out] gekennzeichneten Parameter werden von der Funktion mit Werten gefüllt, da mußt du nur den nötigen Speicherplatz bereitstellen.
(und Die MSDN bietet dir sogar ein Beispiel, wie die Funktion genutzt werden kann - lesen bildet ;))