Hi,
mit MemGetStats() bekommt man ja die Info wieviel Ram zur zeit belegt, frei, prozentual genutzt usw. ist. Wie kann ich aber nun herrausfinden wieviel Arbeitsspeicher ein bestimmtes Programm aktuell belegt?
Hi,
mit MemGetStats() bekommt man ja die Info wieviel Ram zur zeit belegt, frei, prozentual genutzt usw. ist. Wie kann ich aber nun herrausfinden wieviel Arbeitsspeicher ein bestimmtes Programm aktuell belegt?
Da kommt bei mir leider nur CPU: 0 und Ram:0
Hi,
warst schon ganz nah dran. Nimm anstatt Programm Prozess -> .....
ProcessGetStats sollte des Rätsels Lösung sein
;-))
Stefan
Bekomme ich leider auch nur falsche Werte die teilweiße bis zu 30k vom Wert, der im Taskmanager angezeigt wird, abweicht. z.b. Firefox.exe verbraucht 145k und ProcessGetStats spuckt dann 177k aus.
Da kommt bei mir leider nur CPU: 0 und Ram:0
CPU 0% ist ja klar, da Calc.exe ja nichts macht! Kannst ja mal 999999! berechnen!
Bei mir sieht es so aus: calc.exe | PID: 7712 | CPU time: 0:00:00.046 (h:m:s.ms) | Mem usage: 5264 KB | CPU usage: 0 %
Gruß,
UEZ
CPU 0% ist ja klar, da Calc.exe ja nichts macht! Kannst ja mal 999999! berechnen!
Bei mir sieht es so aus: calc.exe | PID: 7712 | CPU time: 0:00:00.046 (h:m:s.ms) | Mem usage: 5264 KB | CPU usage: 0 %
Gruß,
UEZ
Und bei mir so auch nach dem rechnen:
calc.exe | PID: 1776 | CPU time: 0:00:00.249 (h:m:s.ms) | Mem usage: 0 KB | CPU usage: 0 %
CPU geht wären der Rechenzeit kurz hoch aber Mem bleibt in der Anzeige auf 0.
Was für ein OS benutzt du?
Bei mir ist es Vista x32!
Gruß,
UEZ
Win 7 x64.
Win 7 x64.
Hast recht! Auf Win7 x64 im native 64-bit mode geht's nicht! Kompiliere es doch mal vorher mit der Option: #AutoIt3Wrapper_UseX64=n oder RMT -> Compile Script (x86)!
Ich muss mal sehen, wie der Code unter x64 im native mode umgestrickt werden muss...
UEZ
Compile Script (x86) geht aber wie bei ProcessGetStats mit großen Abweichungen.
Im calc.exe Beispiel wird 11540 KB angezeigt laut Taskmanager sind es aber nur 5004
Compile Script (x86) geht aber wie bei ProcessGetStats mit großen Abweichungen.
Im calc.exe Beispiel wird 11540 KB angezeigt laut Taskmanager sind es aber nur 5004
Komisch! Und die Datei im Anhang?
Richtig: unter x64 wird der Mem doppelt so viel angezeigt. Muss mal nachforschen!
UEZ
Kein Unterschied leider, immernoch mehr als das Doppelte der Taskmanageranzeige.
Hi,
getestet unter XP SP3 32 Bit:
[autoit]
#include <array.au3>
Global $strComputer = "localhost"
$arprocstat = _getproc ()
_ArrayDisplay ($arprocstat)
Func _getproc ()
; Generated by AutoIt Scriptomatic
Local $artemp [1] [2], $count = 1, $struser, $strdomain
$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
ReDim $artemp [$count] [2]
$artemp [$count - 1] [0] = $objItem.Caption
;realer Speicher in kb
$artemp [$count - 1] [1] = $objItem.WorkingSetSize / 1024
$count += 1
Next
Else
Return 0
EndIf
Return $artemp
EndFunc
;-))
Stefan
Das gleiche, die Werte sind teilweiße doppelt so hoch wie im Taskmanager.
Hi,
dann scheint es ein OS Problem zu sein -> Win 7 oder 64 bit
;-((
Stefan
Ich installier später vielleicht mal Win 7 x86 dann weiß man zumindestens ob es an der Version oder an Win 7 an sich liegt.
Folgendes sollte nur als 32bit-Version kompiliert funktionieren aber vielleicht erkennst du daran ob du nicht vielleicht 2 unterschiedliche Werte vergleichst, denn soweit ich mich erinnern kann zeigt der TaskManager den Wert WorkingSetSize an:
$Prozessname = "calc.exe"
$PMemInfo = _GetProcessMemInfo($Prozessname)
$Text = $Prozessname & @CRLF & @CRLF & _
"PeakWorkingSetSize: " & $PMemInfo[0] & ' kb' & @CRLF & _
"WorkingSetSize: " & $PMemInfo[1] & ' kb' & @CRLF & _
"QuotaPeakPagedPoolUsage: " & $PMemInfo[2] & ' kb' & @CRLF & _
"QuotaPagedPoolUsage: " & $PMemInfo[3] & ' kb' & @CRLF & _
"QuotaPeakNonPagedPoolUsage: " & $PMemInfo[4] & ' kb' & @CRLF & _
"QuotaNonPagedPoolUsage: " & $PMemInfo[5] & ' kb' & @CRLF & _
"PagefileUsage: " & $PMemInfo[6] & ' kb' & @CRLF & _
"PeakPagefileUsage: " & $PMemInfo[7] & ' kb' & @CRLF & _
"PrivateUsage: " & $PMemInfo[8] & ' kb'
MsgBox(0,"", $Text)
[/autoit] [autoit][/autoit] [autoit];by AspirinJunkie
Func _GetProcessMemInfo($PID)
Local $PROCESS_MEMORY_COUNTERSEX, $StructSize, $PHandle, $StructPointer
Local $RetArray[9]
If IsString($PID) Then $PID = ProcessExists($PID)
If $PID < 1 Then Return SetError(1,1,$RetArray)
$PHandle = DllCall("Kernel32.dll", "int", "OpenProcess", "dword", 0x400 + 0x10, "dword", False, "dword", $PID)
If @error Or Not $PHandle[0] Then Return SetError(2,2,$RetArray)
$PHandle = $PHandle[0]
[/autoit] [autoit][/autoit] [autoit]$PROCESS_MEMORY_COUNTERSEX = DllStructCreate("dword; dword; uint; uint; uint; uint; uint; uint; uint; uint; uint")
$StructSize = DllStructGetSize($PROCESS_MEMORY_COUNTERSEX)
$StructPointer = DllStructGetPtr($PROCESS_MEMORY_COUNTERSEX)
DllCall("Psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $PHandle, "ptr", $StructPointer, "dword", $StructSize)
DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $PHandle)
For $i = 0 To 8
$RetArray[$i] = DllStructGetData($PROCESS_MEMORY_COUNTERSEX, $i + 2) / 1024
Next
Return $RetArray
EndFunc
Außerdem solltest du beachten dass es sich immer nur um eine Momentaufnahme handelt und die Werte sich durchaus verändern können.
Bei ProcessGetStats kannst ja auch WorkingSetSize und PeakWorkingSetSize anzeigen lassen und beide stimmen dort auch nicht. Unter Win XP gehen die Scripte bei mir ja auch nur nicht unter Win 7 x64.
Dein Script geht leider auch nicht, werden garkeine Werte vor "kb" angezeigt.
Ich sagte ja: Es geht nur wenn du es als 32Bit kompilierst (hab es extra nochmal auf Win7 x64 probiert)
Dort hast du halt noch mehr Werte zur Auswahl also teste es wirklich mal.