z0mgItsJohn Posted November 15, 2008 Posted November 15, 2008 Iv Seen The '_ProcessListProperties' But I Can't Seem To Get It To Work Could Someone Maybe Post A Little Function To Get The CPU Usage On 1 Process? Thanks :3 - John Latest Projects :- New & Improved TCP Chat
PsaltyDS Posted November 15, 2008 Posted November 15, 2008 Iv Seen The '_ProcessListProperties' But I Can't Seem To Get It To Work Could Someone Maybe Post A Little Function To Get The CPU Usage On 1 Process? Thanks :3- JohnWhat happened when you tried _ProcessListProperties()? You could extract from that function just the part that gets the CPU usage, but the time-based properties require the SwbemRefresher part so that will not save you much using WMI. Using the DLLs directly for this is over my head, but maybe others know how to get it that way. Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
UEZ Posted November 15, 2008 Posted November 15, 2008 (edited) Here an example I wrote:expandcollapse popup;working only with explore.exe and its subprocesses!!! #include <WindowsConstants.au3> Opt('MustDeclareVars', 1) Opt("TrayIconHide", 1) HotKeySet("{ESC}", "_Exit") Global Const $Process_All_Access = 0x1F0FFF Global $CreateTime = DllStructCreate("dword;dword") Global $ExitTime = DllStructCreate("dword;dword") Global $KernelTime = DllStructCreate("dword;dword") Global $UserTime = DllStructCreate("dword;dword") Global $FileTime = DllStructCreate("dword;dword") Global $SystemTime = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort") Global $IdleTime = DllStructCreate("dword;dword") Global $sUserTime, $sKernelTime, $eUserTime, $eKernelTime Global $ret, $hour, $minutes, $seconds, $milliseconds Global $ProcHandle, $Process_CPU_Usage Global $PID, $CPUTime, $mem, $prg Global $logical_cpus = CPU() Global $hProc Global $GUI, $info $prg = "calc.exe" Run($prg) Sleep(500) $PID = ProcessExists($prg) If $PID = 0 Then ConsoleWrite(@CRLF & "ERROR! Process " & $prg & " not found! Aborting..." & @CRLF) Exit EndIf Global $iMemo, $hDebugGUI $GUI = GUICreate("Process Information v0.30 Beta by UEZ - Press ESC to quit!", 740, 25, -1, -1, BitOR($WS_CAPTION,$WS_POPUP,$WS_BORDER,$WS_CLIPSIBLINGS)) $iMemo = GUICtrlCreateEdit("", -1, -1, 820) GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New") GUICtrlSetBkColor($iMemo, 0xFFFFFF) GUISetState() $ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", $Process_All_Access, "int", False, "dword", $PID) $ProcHandle = $ProcHandle[0] ;~ ConsoleWrite(@CRLF & @CRLF & "Process Information v0.30 Beta by UEZ" & @CRLF) ;~ ConsoleWrite("=====================================" & @CRLF & @CRLF) ;~ ConsoleWrite("(Press ESC to exit)" & @CRLF) While 1 $CPUTime = _GetProcTime($ProcHandle) $mem = _ProcessGetMem($ProcHandle) / 1024 $hour = Int($CPUTime / 10000000 / 3600) $minutes = Int($CPUTime / 10000000 / 60) If $minutes < 10 Then $minutes = "0" & $minutes $seconds = Round((Int($CPUTime / 10000000) / 60 - Int($CPUTime / 10000000 / 60)) * 60, 0) If $seconds < 10 Then $seconds = "0" & $seconds $milliseconds = Round((Int($CPUTime / 10000) / 1000 - Int(Int($CPUTime / 10000) / 1000)) * 1000, 0) If $milliseconds < 10 Then $milliseconds = "00" & $milliseconds If $milliseconds > 9 And $milliseconds < 100 Then $milliseconds = "0" & $milliseconds $info = @CR & $prg & " | PID: " & $PID & " | CPU time: " & $hour & ":" & $minutes & ":" & $seconds & "." & $milliseconds & " (h:m:s.ms) | Mem usage: " & $mem & " KB | CPU usage: " & $Process_CPU_Usage & " % " & @CR MemoWrite($info) ;~ ConsoleWrite($prg & " | PID: " & $PID & " | CPU time: " & $hour & ":" & $minutes & ":" & $seconds & "." & $milliseconds & " (h:m:s.ms) | Mem usage: " & $mem & " KB | CPU usage: " & $Process_CPU_Usage & " % " & @CR) Sleep(1000) If Not ProcessExists($PID) Then _Exit() WEnd Func MemoWrite($sMessage = "") GUICtrlSetData($iMemo, $sMessage) EndFunc ;==>MemoWrite Func _GetProcTime($ProcessHandle) $ret = DllCall("kernel32.dll", "int", "GetProcessTimes", "int", $ProcessHandle, "ptr", DllStructGetPtr($CreateTime), "ptr", DllStructGetPtr($ExitTime), "ptr", DllStructGetPtr($KernelTime), "ptr", DllStructGetPtr($UserTime)) If $ret[0] = 0 Then ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessTimes call" & @CRLF) SetError(1, 0, $ret[0]) EndIf $sKernelTime = DllStructGetData($KernelTime, 1) $sUserTime = DllStructGetData($UserTime, 1) $Process_CPU_Usage = Floor(($sKernelTime - $eKernelTime + $sUserTime - $eUserTime) / 100000 / $logical_cpus) If $Process_CPU_Usage > 100 Then $Process_CPU_Usage = "100" $eKernelTime = $sKernelTime $eUserTime = $sUserTime Return $sUserTime + $sKernelTime EndFunc ;==>_GetProcTime Func _ProcessGetMem($ProcessHandle) ;get physical memory of the process -> http://msdn.microsoft.com/en-us/library/ms683219%28VS.85%29.aspx Local $structPROCESS_MEMORY_COUNTERS, $structPROCESS_MEMORY_COUNTERS_EX, $nSize, $aRet If @OSVersion <> "WIN_7" Then $structPROCESS_MEMORY_COUNTERS = DllStructCreate("dword cb; dword PageFaultCount; uint PeakWorkingSetSize; uint WorkingSetSize; " & _ "uint QuotaPeakPagedPoolUsage; uint QuotaPagedPoolUsage; uint QuotaPeakNonPagedPoolUsage; " & _ "uint QuotaNonPagePoolUsage; uint PagefileUsage; uint PeakPagefileUsage") ;http://msdn.microsoft.com/en-us/library/ms684877%28VS.85%29.aspx $nSize = DllStructGetSize($structPROCESS_MEMORY_COUNTERS) $aRet = DllCall("psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $ProcessHandle, "ptr", DllStructGetPtr($structPROCESS_MEMORY_COUNTERS), "dword", $nSize) ;call GetProcessMemoryInfo If $aRet[0] = 0 Then ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessMemoryInfo call" & @LF) SetError(1, 0, $aRet[0]) EndIf Return DllStructGetData($structPROCESS_MEMORY_COUNTERS, "WorkingSetSize") Else $structPROCESS_MEMORY_COUNTERS_EX = DllStructCreate("dword cb; dword PageFaultCount; uint PeakWorkingSetSize; uint WorkingSetSize; " & _ "uint QuotaPeakPagedPoolUsage; uint QuotaPagedPoolUsage; uint QuotaPeakNonPagedPoolUsage; " & _ "uint QuotaNonPagePoolUsage; uint PagefileUsage; uint PeakPagefileUsage; " & _ "uint PrivateUsage") ;http://msdn.microsoft.com/en-us/library/ms684877%28VS.85%29.aspx $nSize = DllStructGetSize($structPROCESS_MEMORY_COUNTERS_EX) $aRet = DllCall("Kernel32.dll", "int", "K32GetProcessMemoryInfo", "hwnd", $ProcessHandle, "ptr", DllStructGetPtr($structPROCESS_MEMORY_COUNTERS_EX), "dword", $nSize) ;call GetProcessMemoryInfo If $aRet[0] = 0 Then ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessMemoryInfo call" & @LF) SetError(1, 0, $aRet[0]) EndIf ;~ ConsoleWrite("WorkingSetSize: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "WorkingSetSize") / 1024, 0) & @CRLF & _ ;~ "PrivateUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PrivateUsage") / 1024, 0) & @CRLF & @CRLF) Return DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PrivateUsage") EndIf EndFunc ;==>_ProcessGetMem Func CPU() ;get logical CPU(s) Local $i, $j, $x, $os, $colItems, $HW_Processor_Description, $HW_Processor_Manufacturer, $HW_Processor_MaxClockSpeed, $HW_Processor_Name, $HW_Processor_SocketDesignation Local $system = "Localhost" Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $system & "\root\cimv2") $colItems = $objWMIService.ExecQuery("SELECT Caption from Win32_OperatingSystem", "WQL", 0x30) ;get OS version If IsObj($colItems) Then For $objItem In $colItems $os = $objItem.Caption Next EndIf If StringInStr($os, "2003") > 0 Or StringInStr($os, "2000") > 0 Or StringInStr(StringUpper($os), "XP") > 0 Then $colItems = $objWMIService.ExecQuery("Select Name, Description, Manufacturer, MaxClockSpeed, SocketDesignation from Win32_Processor", "WQL", 0x30) Else $colItems = $objWMIService.ExecQuery("Select Name, Description, Manufacturer, MaxClockSpeed, SocketDesignation, NumberOfCores, NumberOfLogicalProcessors from Win32_Processor", "WQL", 0x30) EndIf If IsObj($colItems) Then $i = 0 $j = 0 $HW_Processor_SocketDesignation = "" For $objItem In $colItems ;get amount of logical CPUs If StringInStr(StringLower($HW_Processor_SocketDesignation), StringLower($objItem.SocketDesignation)) = 0 Then $HW_Processor_SocketDesignation &= $objItem.SocketDesignation & ", " EndIf $i = $i + 1 Next If StringInStr($os, "2003") > 0 Or StringInStr($os, "2000") > 0 Or StringInStr(StringUpper($os), "XP") > 0 Then $x = StringSplit(Remove_Last_Comma($HW_Processor_SocketDesignation), ",") $j = UBound($x) - 1 Else $i = $objItem.NumberOfCores $j = $objItem.NumberOfLogicalProcessors / $i EndIf If $j > $i Then $j = $i EndIf Return ($i) EndFunc ;==>CPU Func Remove_Last_Comma($str) If StringRight($str, 2) = ", " Then $str = StringMid($str, 1, StringLen($str) - 2) Return $str EndFunc ;==>Remove_Last_Comma Func _Exit() DllCall("kernel32.dll", "int", "CloseHandle", "int", $ProcHandle) DllCall("psapi.dll", "int", "CloseHandle", "hwnd", $ProcHandle) ProcessClose($pid) Exit EndFunc ;==>_ExitIt is a CMD tool. So start it in CMD but before you do it start Calc.exe.(don't forget to increase Screen Buffer Size in CMD to a higher value than 80. E.g. 160, otherwise output will be printed always to next line)Afterwards to will see someting like this:Process Information v0.25 Beta by UEZ====================================(Press ESC to exit)Calc.exe | PID: 4252 | CPU time: 0:00:00.109 (h:m:s.ms) | Mem usage: 5052 MB | CPU usage: 0 %If you gonna now calculate something then the CPU usage should change, e.g. 123456789! (n!)UEZ Edited February 26, 2010 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
UEZ Posted December 16, 2008 Posted December 16, 2008 (edited) Additional remark: my code above can only handle processes from explorer.exe and its subprocesses. To monitor e.g. services code needs to be modified!Thanks to Paulchen for the hint!UEZ Edited December 16, 2008 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now