Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 02:57

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



RAM Verbrauch eines Prozesses auslesen?

Discussion on RAM Verbrauch eines Prozesses auslesen? within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
falaga's Avatar
 
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.
falaga is offline  
Old 01/19/2014, 00:52   #2
 
alpines's Avatar
 
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.
alpines is offline  
Thanks
1 User
Old 01/19/2014, 01:26   #3
 
falaga's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
Quote:
Originally Posted by alpines View Post

// 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.
falaga is offline  
Old 01/19/2014, 01:38   #4
 
alpines's Avatar
 
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.
alpines is offline  
Thanks
1 User
Old 01/19/2014, 01:45   #5

 
snow's Avatar
 
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.
snow is offline  
Thanks
2 Users
Old 01/19/2014, 01:50   #6
 
falaga's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
Quote:
Originally Posted by snow911 View Post
- 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.
falaga is offline  
Old 01/19/2014, 02:07   #7
 
alpines's Avatar
 
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.
alpines is offline  
Thanks
1 User
Old 01/19/2014, 02:12   #8
 
falaga's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
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.
falaga is offline  
Old 01/19/2014, 02:14   #9
 
alpines's Avatar
 
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.
alpines is offline  
Old 01/19/2014, 02:20   #10
 
falaga's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
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?
falaga is offline  
Old 01/19/2014, 02:21   #11
 
alpines's Avatar
 
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
alpines is offline  
Thanks
1 User
Old 01/19/2014, 02:35   #12
 
falaga's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
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ß
falaga is offline  
Old 01/19/2014, 02:48   #13
 
alpines's Avatar
 
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.
alpines is offline  
Thanks
1 User
Old 01/19/2014, 02:50   #14
 
falaga's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 1,103
Received Thanks: 454
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.
falaga is offline  
Old 01/19/2014, 03:01   #15
 
alpines's Avatar
 
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.
alpines is offline  
Thanks
1 User
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.