Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speicherauslastung eines beliebigen Prozesses anzeigen (https://www.delphipraxis.net/19002-speicherauslastung-eines-beliebigen-prozesses-anzeigen.html)

The-X 14. Mai 2004 13:50

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Gehe ich richtig in der Annahme das GetProcessMemoryInfo nicht auf 9x Systemen funktioniert ?

habe die obigen Code-schnipsel mal in meine Processlist gepackt und nebenbei noch GetProcessMemoryInfo dynamisch geladen, aber ich bekomme als Ergebnis immer nur 0 Byte raus :(

wenn's mit GetProcessMemoryInfo nicht funktioniert unter 9x wie können das dann andere Programme ?
(WinSystem98 o.ä.)

c113plpbr 14. Mai 2004 14:06

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Zitat:

Zitat von The-X
Gehe ich richtig in der Annahme das GetProcessMemoryInfo nicht auf 9x Systemen funktioniert?

Guggst du hier: MSDN-Library durchsuchenGetProcessMemoryInfo
... Und da steht, dass es nur unter NT-Systemen funzt ... oder hab ich mich verguggt?

Wie es unter 9x Systemen funzt weis ich aber auch nicht ...

Luckie 14. Mai 2004 14:24

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Win9x liefert diese Information, glaube ich, nicht so ohen weiteres.

The-X 14. Mai 2004 23:35

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
dann frag ich mich, wie WinSystem98 (von NewTech Software) es schafft so genaue Angaben z.B. über den Speicherverbrauch von meinem Delphi zu machen :roll:
siehe Anhang...

[edit]
link *nochmal* auf neuste/letze Version geändert :)
[/edit]

Luckie 14. Mai 2004 23:45

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Ich sagte nicht so ohne weiteres. Ich habe nicht gesagt, dass es unmöglich sei. ;)

The-X 15. Mai 2004 00:08

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Das es nicht unmöglich ist (grins, doppelte verneinung) seh ich ja...
nur frag ich mich wie es geht :roll:
zum debuggen ist mir das teil 'n wenig zu komplex (hab mir das teil eben mit'm Disassembler angesehen) aber ich könnte ja mal versuchen den Autor zu fragen (Französisch-Kenntnisse rauskram)
der hat's in VC++ 6 gelöst (lt. PeID) ;)

NicoDE 15. Mai 2004 01:57

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Zitat:

Zitat von The-X
nur frag ich mich wie es geht :roll:

Warum so kompliziert denken... Mit VirtualQueryEx von Adresse 0 an alle Speicher-Blöcke durchlaufen und Details über Module und Heaps per CreateToolhelp32Snapshot. Man muss die Informationsflut dann nur noch brauchbar darstellen können :9

toms 15. Mai 2004 07:47

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Hi,

Habe ein VB Funktion gefunden, um die Speicherauslastung eines Prozesses anzuzeigen.

Code:
Function GetProcessMemUsage(hprocess As Long) As Long
   Dim lpMem As Long
   Dim lPrivateBytes As Long
   Dim ret&
   Dim si As SYSTEM_INFO
   Dim mbi As MEMORY_BASIC_INFORMATION
   Dim lLenMbi&
   GetProcessMemUsage = -1
   lLenMbi = Len(mbi)
   Call GetSystemInfo(si)
   lpMem = si.lpMinimumApplicationAddress
   While lpMem < si.lpMaximumApplicationAddress
       mbi.RegionSize = 0
       ret = VirtualQueryEx(hprocess, lpMem, mbi, lLenMbi)
       If ret = lLenMbi Then
           If ((mbi.lType = MEM_private) And (mbi.State = MEM_COMMIT)) Then ' this block is In use by this process
               lPrivateBytes = lPrivateBytes + mbi.RegionSize
           End If
           On Error GoTo Finished
           lpMem = mbi.BaseAddress + mbi.RegionSize
           On Error GoTo 0
       Else
           Exit Function
       End If
   Wend
Finished:
   GetProcessMemUsage = lPrivateBytes
End Function

Hier ein quick & dirty Übersetzung nach Delphi:

Delphi-Quellcode:
function GetProcessMemUsage(hprocess: THandle) : Longint;
var
   lpMem : Cardinal;
   lPrivateBytes : Longint;
   ret:DWORD;
   si : TSystemInfo;
   mbi : TMemoryBasicInformation;
   lLenMbi: DWORD;
   x: Integer;
begin
   GetProcessMemUsage := -1;
   lLenMbi := SizeOf(mbi);
   GetSystemInfo(si);
   lpMem := Cardinal(si.lpMinimumApplicationAddress);
   while DWORD(lpMem) < DWORD(si.lpMaximumApplicationAddress) do
   begin
       mbi.RegionSize := 0;
       ret := VirtualQueryEx(hprocess, Pointer(lpMem), mbi, lLenMbi);
       If ret = lLenMbi Then
       begin
           If ((mbi.Type_9 = MEM_private) and (mbi.State = MEM_COMMIT)) then // this block is In use by this process
           begin
               lPrivateBytes := lPrivateBytes + mbi.RegionSize
           end; {if}
           lpMem := DWORD(mbi.BaseAddress) + DWORD(mbi.RegionSize);
       end else
       begin
          Result := lPrivateBytes;
          Exit;
       end;
   end; {while}
     Result := lPrivateBytes;
end;

Problem: GetProcessMemoryInfo & GetProcessMemUsage geben nicht den gleichen Rückgabewert.
Gibt wahrscheinlich einen (oder mehrere Fehler) in der Übersetzung oder die Funktion stimmt nicht ganz.

The-X 16. Mai 2004 13:10

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von The-X
nur frag ich mich wie es geht :roll:

Warum so kompliziert denken... Mit VirtualQueryEx von Adresse 0 an alle Speicher-Blöcke durchlaufen und Details über Module und Heaps per CreateToolhelp32Snapshot. Man muss die Informationsflut dann nur noch brauchbar darstellen können :9

so kompliziert wie WS98 das macht/ausgibt wollt ich das garnicht ;)
lediglich den gesamten Speicherverbrauch unter 9x brauch ich für meinen "Task-Manager"
sonst muss ich halt auf diese Angabe bei 9x verzichten (wie so oft, weil die entsprechende Funktion nur NT-basiert existiert/funktioniert :twisted: ) wie auch bei meinem xNetStat :cry:

NicoDE 16. Mai 2004 14:29

Re: Speicherauslastung eines beliebigen Prozesses anzeigen
 
Zitat:

Zitat von The-X
lediglich den gesamten Speicherverbrauch unter 9x brauch ich für meinen "Task-Manager"

GetProcessMemoryInfo gibt aber eigentlich nicht den gesamten Speicherverbrauch zurück, sondern eher die Größe des 'WorkingSet' (aktuelle im physikalischen Speicher befindliche Seiten - sind also zwei völlig verschiedene Informationen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.
Seite 2 von 2     12   

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