【问题标题】:Get CPU usage (in %)获取 CPU 使用率(以 % 为单位)
【发布时间】:2016-05-19 10:29:47
【问题描述】:

我想使用 AutoIt 将 CPU 使用率(以 % 为单位)设置为变量。有没有像MemGetStats() 这样的功能?

【问题讨论】:

    标签: windows cpu-usage autoit


    【解决方案1】:

    WMI 很慢。 The following solution 返回速度更快,包括每个处理器内核的信息:

    $aUsage = _GetCPUUsage()
    For $i = 1 To $aUsage[0]
        ConsoleWrite('CPU #' & $i & ' - ' & $aUsage[$i] & '%' & @CRLF)
    Next
    
    ;#####################################################################
    ;# Function: _GetCPUUsage()
    ;# Gets the utilization of the CPU, compatible with multicore
    ;# Return:   Array
    ;#           Array[0] Count of CPU, error if negative
    ;#           Array[n] Utilization of CPU #n in percent
    ;# Error:    -1 Error at 1st Dll-Call
    ;#           -2 Error at 2nd Dll-Call
    ;#           -3 Error at 3rd Dll-Call
    ;# Author:   Bitboy  (AutoIt.de)
    ;#####################################################################
    Func _GetCPUUsage()
        Local Const $SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = 8
        Local Const $SYSTEM_TIME_INFO = 3
        Local Const $tagS_SPPI = "int64 IdleTime;int64 KernelTime;int64 UserTime;int64 DpcTime;int64 InterruptTime;long InterruptCount"
    
        Local $CpuNum, $IdleOldArr[1],$IdleNewArr[1], $tmpStruct
        Local $timediff = 0, $starttime = 0
        Local $S_SYSTEM_TIME_INFORMATION, $S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
        Local $RetArr[1]
    
        Local $S_SYSTEM_INFO = DllStructCreate("ushort dwOemId;short wProcessorArchitecture;dword dwPageSize;ptr lpMinimumApplicationAddress;" & _
        "ptr lpMaximumApplicationAddress;long_ptr dwActiveProcessorMask;dword dwNumberOfProcessors;dword dwProcessorType;dword dwAllocationGranularity;" & _
        "short wProcessorLevel;short wProcessorRevision")
    
        $err = DllCall("Kernel32.dll", "none", "GetSystemInfo", "ptr",DllStructGetPtr($S_SYSTEM_INFO))
    
        If @error Or Not IsArray($err) Then
            Return $RetArr[0] = -1
        Else
            $CpuNum = DllStructGetData($S_SYSTEM_INFO, "dwNumberOfProcessors")
            ReDim $RetArr[$CpuNum+1]
            $RetArr[0] = $CpuNum
        EndIf
        $S_SYSTEM_INFO = 0
    
        While 1
            $S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = DllStructCreate($tagS_SPPI)
            $StructSize = DllStructGetSize($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
            $S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = DllStructCreate("byte puffer[" & $StructSize * $CpuNum & "]")
            $pointer = DllStructGetPtr($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
    
            $err = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", _
                "int", $SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, _
                "ptr", DllStructGetPtr($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), _
                "int", DllStructGetSize($S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), _
                "int", 0)
    
            If $err[0] Then
                Return $RetArr[0] = -2
            EndIf
    
            Local $S_SYSTEM_TIME_INFORMATION = DllStructCreate("int64;int64;int64;uint;int")
            $err = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", _
                "int", $SYSTEM_TIME_INFO, _
                "ptr", DllStructGetPtr($S_SYSTEM_TIME_INFORMATION), _
                "int", DllStructGetSize($S_SYSTEM_TIME_INFORMATION), _
                "int", 0)
    
            If $err[0] Then
                Return $RetArr[0] = -3
            EndIf
    
            If $starttime = 0 Then
                ReDim $IdleOldArr[$CpuNum]
                For $i = 0 to $CpuNum -1
                    $tmpStruct = DllStructCreate($tagS_SPPI, $Pointer + $i*$StructSize)
                    $IdleOldArr[$i] = DllStructGetData($tmpStruct,"IdleTime")
                Next
                $starttime = DllStructGetData($S_SYSTEM_TIME_INFORMATION, 2)
                Sleep(100)
            Else
                ReDim $IdleNewArr[$CpuNum]
                For $i = 0 to $CpuNum -1
                    $tmpStruct = DllStructCreate($tagS_SPPI, $Pointer + $i*$StructSize)
                    $IdleNewArr[$i] = DllStructGetData($tmpStruct,"IdleTime")
                Next
    
                $timediff = DllStructGetData($S_SYSTEM_TIME_INFORMATION, 2) - $starttime
    
                For $i=0 to $CpuNum -1
                    $RetArr[$i+1] = Round(100-(($IdleNewArr[$i] - $IdleOldArr[$i]) * 100 / $timediff))
                Next
    
                Return $RetArr
            EndIf
    
            $S_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = 0
            $S_SYSTEM_TIME_INFORMATION = 0
            $tmpStruct = 0
        WEnd
    EndFunc
    

    【讨论】:

    • 感谢您的精确。我会尽快尝试。
    【解决方案2】:

    我刚刚找到了解决方案:

    Func _Processor_Usage()
        Local $s_Text       = ''
        Dim $Obj_WMIService = ObjGet('winmgmts:\\' & @ComputerName & '\root\cimv2')
    
        If IsObj($Obj_WMIService) And Not @error Then
            Dim $Col_Items = $Obj_WMIService.ExecQuery('SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor')
    
            Local $Obj_Item
            For $Obj_Item In $Col_Items
                Local $s_Text = $Obj_Item.PercentProcessorTime & '%'
            Next
    
            Return String($s_Text)
        EndIf
    
        Return 0
    EndFunc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      相关资源
      最近更新 更多