jak2003 发表于 2010-3-19 22:44:22

如何检测某个进程占用多少CPU

如题!
现在是某个进程经常占用CPU50% 我想做个程序检测他 发现超过50% 就杀
没超过就潜伏着

netegg 发表于 2010-3-19 23:15:30

你先考虑考虑au3做实时监控要费多少再说吧

menfan 发表于 2010-3-20 11:19:27

好像有个UDF可以做到,找找吧

sensel 发表于 2010-3-21 09:25:17

;====================================================================================
; Function Name:    _ProcessListProperties()
; Description:      Get various properties of a process, or all processes
; Call With:      _ProcessListProperties([$Process[, $sComputer]])
; Parameter(s):   (optional) $Process - PID or name of a process, default is "" (all)
;                   (optional) $sComputer - remote computer to get list from, default is local
; Requirement(s):   AutoIt v3.2.4.9+
; Return Value(s):On Success - Returns a 2D array of processes, as in ProcessList()
;                   with additional columns added:
;                   - Number of processes listed (can be 0 if no matches found)
;                   - 1st process name
;                   - 1st process PID
;                   - 1st process Parent PID
;                   - 1st process owner
;                   - 1st process priority (0 = low, 31 = high)
;                   - 1st process executable path
;                   - 1st process CPU usage
;                   - 1st process memory usage
;                   - 1st process creation date/time = "MM/DD/YYY hh:mm:ss" (hh = 00 to 23)
;                   - 1st process command line string
;                   ...
;                   thru - last process properties
; On Failure:       Returns array with = 0 and sets @Error to non-zero (see code below)
; Author(s):      PsaltyDS at http://www.autoitscript.com/forum
; Date/Version:   09/17/2008--v2.0.3
; Notes:            If an integer PID or string process name is provided and no match is found,
;                   then = 0 and @error = 0 (not treated as an error, same as ProcessList)
;                   This function requires admin permissions to the target computer.
;                   All properties come from the Win32_Process class in WMI.
;                   To get time-base properties (CPU and Memory usage), a 100ms SWbemRefresher is used.
;====================================================================================
Func _ProcessListProperties($Process = "", $sComputer = ".")
        Local $sUserName, $sUserDomain, $dtmDate
        Local $avProcs = [], $n = 1
        Local $oWMI, $colProcs

        ; Convert PID if passed as string
        If StringIsInt($Process) Then $Process = Int($Process)

        ; Connect to WMI and get process objects
        $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate, authenticationLevel=pktPrivacy, (Debug)}!\\" & $sComputer & "\root\CIMV2")
        If IsObj($oWMI) Then
                ; Get collection processes from Win32_Process
                If $Process = "" Then
                        ; Get all
                        $colProcs = $oWMI.ExecQuery("SELECT * FROM Win32_Process")
                ElseIf IsInt($Process) Then
                        ; Get by PID
                        $colProcs = $oWMI.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = " & $Process)
                Else
                        ; Get by Name
                        $colProcs = $oWMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & $Process & "'")
                EndIf

                If IsObj($colProcs) Then
                        ; Return for no matches
                        If $colProcs.Count = 0 Then Return $avProcs

                        ; Size the array
                        ReDim $avProcs[$colProcs.Count + 1]
                        $avProcs = UBound($avProcs) - 1

                        ; For each process...
                        For $oProc In $colProcs
                                ; = Process name
                                $avProcs[$n] = $oProc.Name
                                ; = Process PID
                                $avProcs[$n] = $oProc.ProcessId
                                ; = Parent PID
                                $avProcs[$n] = $oProc.ParentProcessId
                                ; = Owner
                                If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n] = $sUserDomain & "\" & $sUserName
                                ; = Priority
                                $avProcs[$n] = $oProc.Priority
                                ; = Executable path
                                $avProcs[$n] = $oProc.ExecutablePath
                                ; = Creation date/time
                                $dtmDate = $oProc.CreationDate
                                If $dtmDate <> "" Then
                                        ; Back referencing RegExp pattern from weaponx
                                        Local $sRegExpPatt = "\A(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:.*)"
                                        $dtmDate = StringRegExpReplace($dtmDate, $sRegExpPatt, "$2/$3/$1 $4:$5:$6")
                                EndIf
                                $avProcs[$n] = $dtmDate
                                ; = Command line string
                                $avProcs[$n] = $oProc.CommandLine

                                ; increment index
                                $n += 1
                        Next
                Else
                        SetError(2)   ; Error getting process collection from WMI
                EndIf
                ; release the collection object
                $colProcs = 0

                ; Get collection of all processes from Win32_PerfFormattedData_PerfProc_Process
                ; Have to use an SWbemRefresher to pull the collection, or all Perf data will be zeros
                Local $oRefresher = ObjCreate("WbemScripting.SWbemRefresher")
                $colProcs = $oRefresher.AddEnum($oWMI, "Win32_PerfFormattedData_PerfProc_Process").objectSet
                $oRefresher.Refresh

                ; Time delay before calling refresher
                Local $iTime = TimerInit()
                Do
                        Sleep(20)
                Until TimerDiff($iTime) >= 100
                $oRefresher.Refresh

                ; Get PerfProc data
                For $oProc In $colProcs
                        ; Find it in the array
                        For $n = 1 To $avProcs
                                If $avProcs[$n] = $oProc.IDProcess Then
                                        ; = CPU usage
                                        $avProcs[$n] = $oProc.PercentProcessorTime
                                        ; = memory usage
                                        $avProcs[$n] = $oProc.WorkingSet
                                        ExitLoop
                                EndIf
                        Next
                Next
        Else
                SetError(1)   ; Error connecting to WMI
        EndIf

        ; Return array
        Return $avProcs
EndFunc   ;==>_ProcessListProperties
页: [1]
查看完整版本: 如何检测某个进程占用多少CPU