RAM Verbrauch eines Prozesses auslesen?

01/19/2014 00:37 falaga#1
Hallo,
Wie liest man mit AutoIt den RAM Verbrauch eines Prozesses aus?
Um Beispielsweise sowas wie das hier:
Code:
If RAM("metin2client.exe")=<900.000k Then
ProcessClose("metin2client.exe")
Endif
zu schreiben.
Danke.
01/19/2014 00:52 alpines#2
[Only registered and activated users can see links. Click Here To Register...]
// Das retrieved aber leider nur die globalen MemStats.

[Only registered and activated users can see links. Click Here To Register...] spezifiziert das auf einen Prozess.
01/19/2014 01:26 falaga#3
Quote:
Originally Posted by alpines View Post
[Only registered and activated users can see links. Click Here To Register...]
// Das retrieved aber leider nur die globalen MemStats.

[Only registered and activated users can see links. Click Here To Register...] spezifiziert das auf einen Prozess.
Danke für die Antwort.
Ich habe mal zum testen folgendes probiert:
Code:
$aProzess = ProcessGetStats("taskmgr.exe", 0)
MsgBox(64, "Prozess", "Es wird " & $aProzess[0] & " Arbeitsspeicher verbraucht.")
Das Problem ist, dass ich als Antwort sowas wie "6471680" bekomme, was mir allerdings nicht viel aussagt.
01/19/2014 01:38 alpines#4
Schade das es dort nicht vorkommt. Ich schreibe dir kurz eine Funktion mit der du das machen kannst. Gib mir mal kurz 15 Minuten.
01/19/2014 01:45 snow#5
[Only registered and activated users can see links. Click Here To Register...] - die Funktion sollte dafür genügen, für das Handle einfach OpenProcess mit der PID (ProcessWait oder ProcessExists returned die, afaik) aufrufen, in der Struktur ist dann WorkingSetSize für dich interessant, das gibt den momentanen Verbrauch in Byte an (/ 1024 = KByte, / 1024 * 1024 = MByte).

Solltest du die AutoIt-Funktion verwenden wollen: Du bekommst dort ebenfalls die Größe in Bytes, 6471680 Byte sind 6320 KByte, das sind ~6,2 MByte, das dürfte beim Taskmanager hinkommen.
01/19/2014 01:50 falaga#6
Quote:
Originally Posted by snow911 View Post
[Only registered and activated users can see links. Click Here To Register...] - die Funktion sollte dafür genügen, für das Handle einfach OpenProcess mit der PID (ProcessWait oder ProcessExists returned die, afaik) aufrufen, in der Struktur ist dann WorkingSetSize für dich interessant, das gibt den momentanen Verbrauch in Byte an (/ 1024 = KByte, / 1024 * 1024 = MByte).

Solltest du die AutoIt-Funktion verwenden wollen: Du bekommst dort ebenfalls die Größe in Bytes, 6471680 Byte sind 6320 KByte, das sind ~6,2 MByte, das dürfte beim Taskmanager hinkommen.
Die Sache ist beim Task Manager selber wird mir ca. 1.800k angezeigt, was ja anscheinend mit dem Wert der herauskommt nichts zu tun hat.
01/19/2014 02:07 alpines#7
Code:
Func _ProcessGetRAM($sProcess)
	Local $iPID = Run(@ComSpec & " /c tasklist", @SystemDir, @SW_HIDE, 6), $sText

	While 1
		$sText &= StdoutRead($iPID)
		If @error Then ExitLoop
	WEnd

	$sText = StringTrimLeft($sText, StringInStr($sText, $sProcess) - 1)
	$sText = StringTrimRight($sText, StringLen($sText) - StringInStr($sText, @CRLF) + 1)
	$sText = StringTrimLeft($sText, StringInStr($sText, " ", 1, -2))

	Return $sText
EndFunc
Return ist sowas wie 152.000 K. Geht natürlich besser aber das sollte reichen.
152 K = 152 MB.
01/19/2014 02:12 falaga#8
Quote:
Originally Posted by alpines View Post
Code:
Func _ProcessGetRAM($sProcess)
	Local $iPID = Run(@ComSpec & " /c tasklist", @SystemDir, @SW_HIDE, 6), $sText

	While 1
		$sText &= StdoutRead($iPID)
		If @error Then ExitLoop
	WEnd

	$sText = StringTrimLeft($sText, StringInStr($sText, $sProcess) - 1)
	$sText = StringTrimRight($sText, StringLen($sText) - StringInStr($sText, @CRLF) + 1)
	$sText = StringTrimLeft($sText, StringInStr($sText, " ", 1, -2))

	Return $sText
EndFunc
Return ist sowas wie 152.000 K. Geht natürlich besser aber das sollte reichen.
152 K = 152 MB.
Danke vielmals, dass du dir die Mühe gemacht hast!
Was mir aufgefallen ist, ist, dass z.B. bei explorer.exe statt ca. 40.000k, was im Task Mager angezeigt wird, ca. 60.000k herauskommt.
01/19/2014 02:14 alpines#9
Gibt es vielleicht einen anderen Prozess der vor explorer.exe in der Liste vorkommt und eine andere Auslastung hat? Wie z.B. iexplore.exe?

// Ich merks gerade selber, vielleicht ist das einfach der tatsächliche RAM-Verbrauch? Beispielsweise kommt die RAM-Auslastung (Leistung > TaskMgr) nicht mit der Summe aller Prozesse hin.
01/19/2014 02:20 falaga#10
Quote:
Originally Posted by alpines View Post
Gibt es vielleicht einen anderen Prozess der vor explorer.exe in der Liste vorkommt und eine andere Auslastung hat? Wie z.B. iexplore.exe?

// Ich merks gerade selber, vielleicht ist das einfach der tatsächliche RAM-Verbrauch? Beispielsweise kommt die RAM-Auslastung (Leistung > TaskMgr) nicht mit der Summe aller Prozesse hin.
Stimmt, das kann ganz gut sein.
Kann ich denn sowas wie
Code:
If _ProcessGetRAM($sProcess)>800.000k Then
Machen? Eigentlich nicht, wegen dem "k", oder?
01/19/2014 02:21 alpines#11
Doch kannst du nur ist die Abfrage ein bisschen falsch, richtig wäre vermutllich
Code:
If _ProcessGetRAM($sProcess) > "800.000 K" Then ;...
Beachte das Format, ansonsten könnte das zu Problemen führen.

// Das da oben nicht beachten, hab da falsch gedacht ich schaus mir nochmal an.

/// So, Funktion abgeändert. Es returned jetzt Ganzzahlen z.B. 151259 = 151.259MB. Beispiel
Code:
If _ProcessGetRAM("explorer.exe") > 15000 Then MsgBox(64, "Explorer", "Auslastung über 15MB!")

Func _ProcessGetRAM($sProcess)
	Local $iPID = Run(@ComSpec & " /c tasklist", @SystemDir, @SW_HIDE, 6), $sText

	While 1
		$sText &= StdoutRead($iPID)
		If @error Then ExitLoop
	WEnd

	$sText = StringTrimLeft($sText, StringInStr($sText, $sProcess) - 1)
	$sText = StringTrimRight($sText, StringLen($sText) - StringInStr($sText, @CRLF) + 1)
	$sText = StringTrimLeft($sText, StringInStr($sText, " ", 1, -2))
	$sText = StringReplace($sText, ".", "")
	$sTExt = StringReplace($sTExt, " K", "")

	Return $sText
EndFunc
01/19/2014 02:35 falaga#12
Quote:
Originally Posted by alpines View Post
Doch kannst du nur ist die Abfrage ein bisschen falsch, richtig wäre vermutllich
Code:
If _ProcessGetRAM($sProcess) > "800.000 K" Then ;...
Beachte das Format, ansonsten könnte das zu Problemen führen.

// Das da oben nicht beachten, hab da falsch gedacht ich schaus mir nochmal an.

/// So, Funktion abgeändert. Es returned jetzt Ganzzahlen z.B. 151259 = 151.259MB. Beispiel
Code:
If _ProcessGetRAM("explorer.exe") > 15000 Then MsgBox(64, "Explorer", "Auslastung über 15MB!")

Func _ProcessGetRAM($sProcess)
	Local $iPID = Run(@ComSpec & " /c tasklist", @SystemDir, @SW_HIDE, 6), $sText

	While 1
		$sText &= StdoutRead($iPID)
		If @error Then ExitLoop
	WEnd

	$sText = StringTrimLeft($sText, StringInStr($sText, $sProcess) - 1)
	$sText = StringTrimRight($sText, StringLen($sText) - StringInStr($sText, @CRLF) + 1)
	$sText = StringTrimLeft($sText, StringInStr($sText, " ", 1, -2))
	$sText = StringReplace($sText, ".", "")
	$sTExt = StringReplace($sTExt, " K", "")

	Return $sText
EndFunc
Danke, es klappt alles soweit.
Ich überprüfe nun, ob zwischen den Werten im Taskmanager und den Werten durch die Funktion Proportionen existieren. Falls ja, ließe sich das durch eine einfache Rechnung fast gleichstellen.
Danke, du hast mir sehr geholfen.

Edit: Leider sind die Werte alles anderes als proportional zueinander, mal ist der Wert durch die Funktion 10* größer, mal doppelt so groß :(
01/19/2014 02:48 alpines#13
Hmm, alternativ bietet sich noch an die Werte aus der Liste des TaskMgr zu lesen, aber das ist wesentlich umständlicher.
01/19/2014 02:50 falaga#14
Quote:
Originally Posted by alpines View Post
Hmm, alternativ bietet sich noch an die Werte aus der Liste des TaskMgr zu lesen, aber das ist wesentlich umständlicher.
Nunja dann werde ich wohl eine andere Lösung finden müssen, aber trotzdem danke, dass du dich so sehr bemüht hast.
01/19/2014 03:01 alpines#15
Code:
#include <Array.au3>
#include <WinAPIProc.au3>

$a = _WinAPI_GetProcessMemoryInfo(ProcessExists("explorer.exe"))
_ArrayDisplay($a)
Wäre das was snow meint, aber liefert glaube ich nicht das richtige Ergebnis sondern nur das gleiche wie ProcessGetStats.