novatek Posted November 21, 2006 Share Posted November 21, 2006 (edited) expandcollapse popup$sProcess = "" ;All ;~ $sProcess = "Idle" ;Other test process names ;~ $sProcess = "_Total" ;funny one ;~ $sProcess = "ntvdm" ;DOS process ;~ $sProcess = "AutoIt3" ;do not assign .exe to process name ;~ $sProcess = 1234 ;PID for process ;~ $sProcess = 0 ;Idle While 1 $iTimer1 = timerinit() $aProcessCPU = _ProcessListCPU($sProcess, 0) $iTimer2 = int(TimerDiff($iTimer1)) $sTip = "PID" & @TAB & "CPU" & @TAB & "Name" & @LF & @LF for $i = 1 to $aProcessCPU[0][0] $sTip = $sTip & _ $aProcessCPU[$i][1] & @TAB & _ $aProcessCPU[$i][2] & @TAB & _ $aProcessCPU[$i][0] & @LF next $sTip = $sTip & @LF& _ "[0][1]" & @TAB & _ $aProcessCPU[0][1] & @TAB & _ "_TotalUsed" & @LF $sTip = $sTip & _ "[0][2]" & @TAB & _ $aProcessCPU[0][2] & @TAB & _ "_TotalUsedByName" & @LF $sTip = $sTip & _ "[0][0]" & @TAB & _ $aProcessCPU[0][0] & @TAB & _ "_ProcessItems" & @LF $sTip = $sTip & _ " " & @TAB & _ $iTimer2 & @TAB & _ "..function time in ms" & @LF tooltip($sTip) sleep(500) ;set your own sleep time for LOOP mode WEnd Func _ProcessListCPU($strProcess = "", $iSampleTime = 500, $sComputerName = @ComputerName) ;~ All Parameters are optional: ;~ - All process items will be returned if first parameter is not set ;~ - 500 ms is default sample time ;~ - This computer will be measured by default ;~ Process could be string ("Name") or PID number (1234) ;~ For NORMAL MODE(one time measuring): set Sample value to more than 0 ms ;~ ( average CPU usage will be measured during sleep time within function) ;~ For LOOP MODE (continuous measuring): set Sample value to 0 ms ;~ ( average CPU usage will be measured between two function calls ) ;~ ;~ Success: Returns 2-D array $array[0][0] = Number of processes (also upper bound of array) ;~ $array[0][1] = Total CPU usage by All Processes ;~ $array[0][2] = Total CPU usage by All Processes under given process "Name" ;~ ;~ $array[1][0] = 1st Process name ;~ $array[1][1] = 1st Process ID (PID) ;~ $array[1][2] = 1st Process CPU Usage ;~ ;~ $array[2][0] = 2nd Process name ;~ $array[2][1] = 2nd Process ID (PID) ;~ $array[2][2] = 2nd Process CPU Usage ;~ ... ;~ $array[n][0] = nth Process name ;~ $array[n][1] = nth Process ID (PID) ;~ $array[n][2] = nth Process CPU Usage ;~ ;~ Failure: Returns 2-D array $array[0][0] = "" ( wrong process name or PID ) ;~ $array[0][0] = -1 ( process collection not found) ;~ $array[0][0] = -2 ( WMI service not found or Computer not found) dim $aResultSet[1][3] if $strProcess = 0 AND IsNumber($strProcess) then $strProcess = "Idle" if $iSampleTime = "" AND IsString($iSampleTime) then $iSampleTime = 500 if $sComputerName = "" then $sComputerName = @ComputerName if not IsDeclared("aProcess") AND $iSampleTime = 0 then ;first time in loop mode $bFirstTimeInLoopMode = 1 else $bFirstTimeInLoopMode = 0 endif if not IsDeclared("aProcess") then global $aProcess[10000][10] ;[ nul, PID, name, CPU, iP1, iT1, iP2, iT2, iPP, iTT ] ; 0 1 2 3 4 5 6 7 8 9 global $objWMIService $objWMIService = ObjGet("winmgmts:\\" & $sComputerName & "\root\CIMV2") if @error then $aResultSet[0][0] = -2 return $aResultSet endif endif ;First Sample if $iSampleTime OR $bFirstTimeInLoopMode = 1 then ;skip if Loop Mode, but not First time $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_PerfRawData_PerfProc_Process") For $objItem In $colItems $iPID = $objItem.IDProcess If $iPID = 0 AND $objItem.Name = "_Total" Then $iPID = 9999 $aProcess[$iPID][4] = $objItem.PercentProcessorTime $aProcess[$iPID][5] = $objItem.TimeStamp_Sys100NS next if $objItem = "" then $aResultSet[0][0] = -1 ;collection or process not found return $aResultSet endif sleep($iSampleTime) endif ;Second Sample $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_PerfRawData_PerfProc_Process") $iCountItems = 0 $iTotalUsedByName = 0 $iTotalUsed = 0 For $objItem In $colItems if $objItem.Name = "_Total" AND not($strProcess = "_Total") then exitloop $iPID = $objItem.IDProcess If $iPID = 0 AND $objItem.Name = "_Total" Then $iPID = 9999 ;~ $aProcess[$iPID][1] = $objItem.IDProcess ;~ $aProcess[$iPID][2] = $objItem.Name $aProcess[$iPID][6] = $objItem.PercentProcessorTime $aProcess[$iPID][7] = $objItem.TimeStamp_Sys100NS $aProcess[$iPID][8] = $aProcess[$iPID][6] - $aProcess[$iPID][4] ;$iPP = ($iP2 - $iP1) $aProcess[$iPID][9] = $aProcess[$iPID][7] - $aProcess[$iPID][5] ;$iTT = ($iT2 - $iT1) $aProcess[$iPID][3] = round( ($aProcess[$iPID][8] / $aProcess[$iPID][9]) * 100, 0) ;$iCPU = round( ($iPP/$iTT) * 100, 0) $aProcess[$iPID][4] = $aProcess[$iPID][6] ;$iP1 = $iP2 $aProcess[$iPID][5] = $aProcess[$iPID][7] ;$iT1 = $iT2 ;SumTotalUsed if not($objItem.Name = "Idle") AND not($objItem.Name = "_Total") Then $iTotalUsed = $iTotalUsed + $aProcess[$iPID][3] endif ;Result Set if (($strProcess = "") AND IsString($strProcess)) OR _ ;strNAME = "", but not 0 (StringUpper($strProcess) = StringUpper($objItem.Name)) OR _ ;strNAME = objNAME (IsNumber($strProcess) AND ($strProcess = $objItem.IDProcess)) then ;i1234 = obj1234 $iCountItems += 1 redim $aResultSet[$iCountItems +1][3] $aResultSet[$iCountItems][0] = $objItem.Name $aResultSet[$iCountItems][1] = $iPID $aResultSet[$iCountItems][2] = $aProcess[$iPID][3] $aResultSet[0][0] = $iCountItems ;SumTotalByName if not($objItem.Name = "Idle") OR ($strProcess = "Idle") Then $iTotalUsedByName = $iTotalUsedByName + $aProcess[$iPID][3] endif endif next if $objItem = "" then $aResultSet[0][0] = -1 ;collection or process not found return $aResultSet endif $aResultSet[0][1] = $iTotalUsed $aResultSet[0][2] = $iTotalUsedByName Return $aResultSet EndFunc ;==>_ProcessListCPU() by novaTek ...ver 0.02This function is supposed to monotor only one Computer at a time and only one kind of process at a time.For monitoring more computers and more processes (synchronous way), look for this one: Func _ProcessListCPU_more() A simpler, non-array function, for the purpose of measuring only one process at a time, you could find here: Func _ProcessGetCPU() Enjoy! Edited November 25, 2006 by novatek Link to comment Share on other sites More sharing options...
cool0403 Posted November 21, 2006 Share Posted November 21, 2006 allright i appreciate that you do somethin good but What the fuck , dont post the same fuckin shit over and over . its fuckin annoyin okay . dont do it next time Link to comment Share on other sites More sharing options...
spyrorocks Posted November 21, 2006 Share Posted November 21, 2006 cool down. Profanity is the simple mind trying to make a memorable impact. [center] My Projects: Online AutoIt Compiler - AutoForum - AutoGuestbook - AutoIt Web-based Auto Installer - Pure AutoIt Zipping Functions - ConfuseGen - MindReader - P2PChat[/center] Link to comment Share on other sites More sharing options...
Valik Posted November 21, 2006 Share Posted November 21, 2006 cool0403, act like you have some sense or you're gone for good. Link to comment Share on other sites More sharing options...
ConsultingJoe Posted November 21, 2006 Share Posted November 21, 2006 lol, good script but I here a cat fight in this thread. Check out ConsultingJoe.com Link to comment Share on other sites More sharing options...
Valik Posted November 21, 2006 Share Posted November 21, 2006 A cat fight is when two females fight. Since I, at least, am not female, it is not a cat fight. Link to comment Share on other sites More sharing options...
rambo3889 Posted November 21, 2006 Share Posted November 21, 2006 (edited) @Valik im glad that you told cool0403 to stop that kinda talk , because it is annyoing to here him like that and posting the topics about why virus scripts arent allowed here, i just hope he did read it.. @novatek I think i'm gonna use this usefull script in some of the apps that i been making. Thanks Edited November 21, 2006 by rambo3889 My Scripts:Radioblog Club Music DownloaderOther stuff:Fun movieIm serious read the help file it helps :PFight 'Till you drop. Never stop, You Cant give up. Til you reach the top Fight! youÂ’re the best in town Fight! Link to comment Share on other sites More sharing options...
novatek Posted November 21, 2006 Author Share Posted November 21, 2006 @rambo3889 Function is still slow and ugly, but at least it works. I hope I will find some time to improve speed. For now it refreshes in 3 seconds at reasonable cost (e.g. taking less than 3% CPU for it self). Since I am beginner here and not professional programmer - suggestions are appreciated very much. A special note: In NORMAL mode, it is not possible to monitor the script itself (process AutoIt3), because script is pausing (sleep) during two measuring points in Normal mode. This is not the case in LOOP mode, where it "sees itself" properly. Loop Mode is also faster and more accurate method. @Valik, @spyrorocks I don't have time for replaying on strange posts, so thanks you are doing the work. Sincerely, I am not sure I could understand the language of such posts with my poor english. kind regards, novaTek Link to comment Share on other sites More sharing options...
Zach Posted December 31, 2006 Share Posted December 31, 2006 Only comment I have is that its something that at best it can only be used in a controlled environment. It depends on WMI - which you can not depend on being there. As far as the amount of processor its taking up --- 3% is not bad considering - again - its using WMI. Link to comment Share on other sites More sharing options...
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