找回密码
 加入
搜索
查看: 2345|回复: 3

[系统综合] 如何检测某个进程占用多少CPU

[复制链接]
发表于 2010-3-19 22:44:22 | 显示全部楼层 |阅读模式
如题!
现在是某个进程经常占用CPU50% 我想做个程序检测他 发现超过50% 就杀
没超过就潜伏着
发表于 2010-3-19 23:15:30 | 显示全部楼层
你先考虑考虑au3做实时监控要费多少再说吧
发表于 2010-3-20 11:19:27 | 显示全部楼层
好像有个UDF可以做到,找找吧
发表于 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:
;                   [0][0] - Number of processes listed (can be 0 if no matches found)
;                   [1][0] - 1st process name
;                   [1][1] - 1st process PID
;                   [1][2] - 1st process Parent PID
;                   [1][3] - 1st process owner
;                   [1][4] - 1st process priority (0 = low, 31 = high)
;                   [1][5] - 1st process executable path
;                   [1][6] - 1st process CPU usage
;                   [1][7] - 1st process memory usage
;                   [1][8] - 1st process creation date/time = "MM/DD/YYY hh:mm:ss" (hh = 00 to 23)
;                   [1][9] - 1st process command line string
;                   ...
;                   [n][0] thru [n][9] - last process properties
; On Failure:       Returns array with [0][0] = 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][0] = 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[1][2] = [[0]], $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][10]
                        $avProcs[0][0] = UBound($avProcs) - 1

                        ; For each process...
                        For $oProc In $colProcs
                                ; [n][0] = Process name
                                $avProcs[$n][0] = $oProc.Name
                                ; [n][1] = Process PID
                                $avProcs[$n][1] = $oProc.ProcessId
                                ; [n][2] = Parent PID
                                $avProcs[$n][2] = $oProc.ParentProcessId
                                ; [n][3] = Owner
                                If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n][3] = $sUserDomain & "" & $sUserName
                                ; [n][4] = Priority
                                $avProcs[$n][4] = $oProc.Priority
                                ; [n][5] = Executable path
                                $avProcs[$n][5] = $oProc.ExecutablePath
                                ; [n][8] = 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][8] = $dtmDate
                                ; [n][9] = Command line string
                                $avProcs[$n][9] = $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[0][0]
                                If $avProcs[$n][1] = $oProc.IDProcess Then
                                        ; [n][6] = CPU usage
                                        $avProcs[$n][6] = $oProc.PercentProcessorTime
                                        ; [n][7] = memory usage
                                        $avProcs[$n][7] = $oProc.WorkingSet
                                        ExitLoop
                                EndIf
                        Next
                Next
        Else
                SetError(1)   ; Error connecting to WMI
        EndIf

        ; Return array
        Return $avProcs
EndFunc   ;==>_ProcessListProperties

评分

参与人数 1威望 +5 金钱 +25 收起 理由
afan + 5 + 25

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-20 17:45 , Processed in 0.081635 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表