|
You last visited: Today at 02:57
Advertisement
RAM Verbrauch eines Prozesses auslesen?
Discussion on RAM Verbrauch eines Prozesses auslesen? within the AutoIt forum part of the Coders Den category.
01/19/2014, 00:37
|
#1
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
RAM Verbrauch eines Prozesses auslesen?
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
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|

// Das retrieved aber leider nur die globalen MemStats.
 spezifiziert das auf einen Prozess.
|
|
|
01/19/2014, 01:26
|
#3
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
Quote:
Originally Posted by alpines

// Das retrieved aber leider nur die globalen MemStats.
 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
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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
|
#5
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
 - 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
|
#6
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
Quote:
Originally Posted by snow911
 - 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
|
#7
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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
|
#8
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
Quote:
Originally Posted by alpines
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
|
#9
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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
|
#10
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
Quote:
Originally Posted by alpines
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
|
#11
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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
|
#12
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
Quote:
Originally Posted by alpines
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
|
#13
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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
|
#14
|
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
|
Quote:
Originally Posted by alpines
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
|
#15
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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.
|
|
|
 |
|
Similar Threads
|
Klassenfunktion eines anderen Prozesses ausfürhen
04/21/2013 - C/C++ - 19 Replies
Hallo,
ich beschäftige mich im Moment mit Reverse Engineering und dem Schreiben eines Bots für ein RTS-Spiel und brauche dabei etwas Hilfe. Die Programme, die ich benutze sind CheatEngine und IDA Pro. Bei dem Spiel handelt es sich um Heroes of Newerth. Der Programmcode für das Spiel befindet sich in 3 Dlls:
1) k2.dll: enthält viele Klassen und einige statische Pointeradressen, die exportiert werden
2) game_shared.dll: enthält weitere Klassen, die exportiert werden
3) cgame.dll: hier...
|
[VB.Net] Auslesen eines MultiOffsets
02/23/2010 - .NET Languages - 3 Replies
Hey,
ich wollte mal fragen da sich bei der suche danach nichts wirklich was ergeben hat wollte ich frage wie ich in vb.net einen Multi Offset auslesen kann es gibt ja in AutoIt die Funktion _MemoryPointerRead in der NormadeMemory.au3 da wird ja auch die funktion ReadProcessMemory verwenden doch wie bekomme ich das in VB.net umgeschrieben?
Hab mich schon mal probiert:
Public Function ReadFloatPointer(ByVal ProcessName As Process, ByVal Base As Integer, ByVal Offset As Short())
Dim...
|
Wie erlange ich die PID eines Prozesses für z.B. WriteProcessMemory
11/06/2008 - Coding Tutorials - 4 Replies
An die, die noch nicht wissen, wie sie ein Handle eines Prozesses erlangen, folgt hier ein kleiner Beispielquelltext .
Beispielprogramm:
.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include user32.inc
|
All times are GMT +1. The time now is 02:59.
|
|