CPU Auslastung Auslesen

  • Hallo ,

    gibt es eine Möglichkeit die CPU auslastung auszulesen?

    LG Pceumel

    Einmal editiert, zuletzt von pceumel (8. Dezember 2008 um 19:39)

  • ist schon etwas alt, k.a. woher ich die hab!?

    cpuusage.au3:

    Spoiler anzeigen
    [autoit]

    Global $liOldIdleTime = 0
    Global $liOldSystemTime = 0
    ; \/\/\/ Should do this \/\/\/ to initialize CPU time calculations, but not necessary. First call will, with a delay.
    ; CurrentCPU(1)

    [/autoit] [autoit][/autoit] [autoit]

    ;For $n = 1 to 20
    ; $a = CurrentCPU()
    ; ToolTip(@error & @LF & $a)
    ; Sleep(500)
    ;Next

    [/autoit] [autoit][/autoit] [autoit]

    Func CurrentCPU($init = 0)
    Local $SYS_BASIC_INFO = 0
    Local $SYS_PERFORMANCE_INFO = 2
    Local $SYS_TIME_INFO = 3

    [/autoit] [autoit][/autoit] [autoit]

    $SYSTEM_BASIC_INFORMATION = DllStructCreate("int;uint;uint;uint;uint;uint;uint;ptr;ptr;uint;byte;byte;short")
    $status = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", "int", $SYS_BASIC_INFO, _
    "ptr", DllStructGetPtr($SYSTEM_BASIC_INFORMATION), _
    "int", DllStructGetSize($SYSTEM_BASIC_INFORMATION), _
    "int", 0)

    If $status[0] Then Return -1

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $SYSTEM_PERFORMANCE_INFORMATION = DllStructCreate("int64;int[76]")
    $SYSTEM_TIME_INFORMATION = DllStructCreate("int64;int64;int64;uint;int")

    $status = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", "int", $SYS_TIME_INFO, _
    "ptr", DllStructGetPtr($SYSTEM_TIME_INFORMATION), _
    "int", DllStructGetSize($SYSTEM_TIME_INFORMATION), _
    "int", 0)

    If $status[0] Then Return -2

    [/autoit] [autoit][/autoit] [autoit]

    $status = DllCall("ntdll.dll", "int", "NtQuerySystemInformation", "int", $SYS_PERFORMANCE_INFO, _
    "ptr", DllStructGetPtr($SYSTEM_PERFORMANCE_INFORMATION), _
    "int", DllStructGetSize($SYSTEM_PERFORMANCE_INFORMATION), _
    "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    If $status[0] Then Return -3

    If $init = 1 Or $liOldIdleTime = 0 Then
    $liOldIdleTime = DLLStructGetData($SYSTEM_PERFORMANCE_INFORMATION,1)
    $liOldSystemTime = DLLStructGetData($SYSTEM_TIME_INFORMATION,2)
    Sleep(1000)
    If $init = 1 Then Return -99
    Else
    $dbIdleTime = DLLStructGetData($SYSTEM_PERFORMANCE_INFORMATION,1) - $liOldIdleTime
    $dbSystemTime = DLLStructGetData($SYSTEM_TIME_INFORMATION,2) - $liOldSystemTime
    $liOldIdleTime = DLLStructGetData($SYSTEM_PERFORMANCE_INFORMATION,1)
    $liOldSystemTime = DLLStructGetData($SYSTEM_TIME_INFORMATION,2)

    [/autoit] [autoit][/autoit] [autoit]

    $dbIdleTime = $dbIdleTime / $dbSystemTime

    [/autoit] [autoit][/autoit] [autoit]

    $dbIdleTime = 100.0 - $dbIdleTime * 100.0 / DLLStructGetData($SYSTEM_BASIC_INFORMATION,11) + 0.5

    Return $dbIdleTime
    EndIf
    $SYSTEM_PERFORMANCE_INFORMATION = 0
    $SYSTEM_TIME_INFORMATION = 0
    WEnd
    EndFunc

    [/autoit]

    beispiel:

    Spoiler anzeigen
    [autoit]

    #include "Cpuusage.au3"

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    ToolTip(Round(CurrentCpu(),0) & "%")
    Sleep(100)
    WEnd

    [/autoit]

    lgE

  • Hallo ich möchte gerne mit einem Authorensystem eine Videothek programmieren.
    siehe Bild (Stark verkleinert)

    [Blockierte Grafik: http://funkyimg.com/u2/112/221/authorenprogramm.jpg]

    Eine nette idee ist, mit einem kleinen externen Computer, angeschlossen an einem Fernseher, das Programm laufen zu lassen.

    Falls ich das ganze einem Freund gebe, möchte ich ausschließen, dass er versucht einen Film zu starten, obwohl der Computer noch am booten ist.

    So wäre es sinnvoll ein Startbildschirm vom Videoprogramm zu starten ( Bild siehe unten ) und das solange anzeigen zu lassen, bis die Cpu Auslastung in einer bestimmten Zeit unter 5 % fällt ( Beispielswert)

    Dann würde das Videoprogramm (HTPC) die Videofiles freigeben.

    Diese Vorgehensweise finde ich sinnvoller als zu sagen, Du mußt 3 Minuten warten bis Du ein Film Starten kannst.

    Ich habe irgendwo etwas von "DAU" gelesen. Ob es Abkürzung "DAU" heißt, weiß ich nicht mehr. Es soll für dümmster anzunehmender user stehen.

    Fazit, ich möchte DAU ausschliessen :D [Blockierte Grafik: http://funkyimg.com/u2/457/030/funny3_1.jpg]

    [Blockierte Grafik: http://funkyimg.com/u2/235/772/dau.jpg]

    Zu dem Code oben hätte ich gerne gewußt, wie ich es umsetzen kann.
    Ist

    [autoit]

    ToolTip(Round(CurrentCpu(),0) & "%")

    [/autoit]


    CurrentCpu schon die Variable?
    kann ich das so in etwa schreiben..?

    [autoit]

    If $var.... > 0 Then
    MsgBox(4096,"",
    "Der Wert ist positiv")
    ElseIf $var < 0 Then
    MsgBox(4096,"",
    "Der Wert ist negativ")

    [/autoit]

    Da die Kommunikation mit dem Authorensystem nur über Textdatei und Ini-Datei läuft, würde es auch gehen, wenn die CPU Werte in eine INI Datei geschrieben werden und das Authorensystem ließt es regelmäßig aus und nachdem ein bestimmter Wert in einer bestimmten Zeit unterschritten wurde, kann das Authorensystem das Programm von Autoit schließen und die Arbeit fortführen.

    über jede Hilfe bin ich dankbar..

    gruß Slider

  • Hallo, schau mal HIER, dort sind die Funktionen exakt beschrieben.

    Zitat

    Ist CurrentCpu() schon die Variable?

    Ja, die Rückgabe erfolgt in Prozent. In deinem Beispiel könntest du z.B. schreiben

    [autoit]


    Run("calc.exe")
    WinWaitActive("Rechner")
    WinActivate("Rechner")
    Send("!a") ;ansicht
    Sleep(200)
    Send("w")
    Sleep(100)
    ControlSend("Rechner", "", "[CLASS:Edit; INSTANCE:1]", "964535464756") ;zahl ins editfeld
    Sleep(100)
    ControlClick("Rechner", "", "Button35") ;fakultät

    [/autoit][autoit][/autoit][autoit]

    Do ;solange wiederholen .....

    [/autoit][autoit][/autoit][autoit]

    $t = TimerInit() ;timerstamp merken
    Do ;solange wiederholen...
    Sleep(100) ;bissl warten
    ToolTip("Prozessorlast " & _GetCPUUsageOld() & " %") ;Last anzeigen
    Until TimerDiff($t) > 4000 Or _GetCPUUsageOld() > 5 ;....bis die Zeit über 4 Sekunden oder die Last über 5% ist

    [/autoit][autoit][/autoit][autoit]

    Until _GetCPUUsageOld() < 5 ;....bis 4 Sekunden lang die CPU-Last unter 5% ist

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, 0, "Die CPU-Auslastung war 4 Sekunden lang unter 5%")

    [/autoit]


    Der erste Teil des Scriptes startet den Windows Taschenrechner und berechnet die Fakultät einer großen Zahl (100% Prozessorlast).Währenddessen sollte in der Toolbox die Prozessorlast stehen. Nach einigen Sekunden fragt der Taschenrechner nach, ob er weitermachen soll oder anhalten. Dann auf Anhalten klicken. 4 Sekunden nachdem auf "Anhalten" geklickt wurde, erscheint die Messagebox.

  • Hallo Andy,

    vielen dank für Deinen Script.................

    Sorry, war gestern zu sehr gestresst, darum befasse ich mich erst Heute damit.


    Edit:
    Jetzt habe ich ein weiteres Problem, ich habe das Script etwas verkürzt

    [autoit]

    Do ;solange wiederholen .....

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Sleep(100) ;bissl warten
    ToolTip("Prozessorlast " & CurrentCpu() & " %") ;Last anzeigen

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Until CurrentCpu() < 5

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, 0, "Die CPU-Auslastung war unter 5%")

    [/autoit]


    wenn ich das Script starte, dauert es bis zu einer Minute, bis die CPU unter 5% steht
    und bei einem erneuten Programmstart steht es nach einigen Sekunden unter 5% oder SOFORT und das Script wird beendet

    aber unter Windows Taskmanager > CPU Auslastung und unter ToolTip steht 0% bis 0,5% - daher sollte das Programm doch sofort beendet werden

    was ist falsch?

    Edit:

    Ich habe wohl die Lösung gefunden:

    ich habe die ToolTip Anzeige weggelassen, die Prüfung wurde wohl davon gestört

    [autoit]

    ToolTip("Prozessorlast " & CurrentCpu() & " %") ;Last anzeigen

    [/autoit]

    3 Mal editiert, zuletzt von Slider99 (17. November 2009 um 17:00)

  • Sorry, das ich den thread wieder zum leben erwecke, aber eis jmd ob das CPUUsage script auch untrer win7 läuft. bei mir wird immer -1 angezeigt.

  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    ;coded by UEZ
    #AutoIt3Wrapper_UseX64=n
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Opt("TrayIconHide", 1)
    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Global $hFile, $au3, $autoit3
    Global $fname = "Dummy.exe"
    Global $dummy_exe = @ScriptDir & "\" & $fname
    Global $dummy_au3 = @ScriptDir & "\" & "Dummy.au3"
    If Not FileExists($dummy_exe) Then
    $hFile = FileOpen($dummy_au3, 2)
    $au3 = "While 1" & @CRLF & "WEnd"
    FileWrite($hFile, $au3)
    FileClose($hFile)
    If @OSArch = "x86" Then
    $autoit3 = '"' & RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\aut2exe\aut2exe.exe" & '"'
    Else
    $autoit3 = '"' & RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt", "InstallDir") & "\aut2exe\aut2exe.exe" & '"'
    EndIf
    RunWait($autoit3 & ' /in "' & $dummy_au3 & '" /out "' & $dummy_exe & '" /nopack /comp 2')
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $PID = Run($dummy_exe)

    [/autoit] [autoit][/autoit] [autoit]

    If $PID = 0 Then
    MsgBox(16, "ERROR", "ERROR! Process " & $prg & " not found! Aborting..." & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $iMemo, $hDebugGUI
    $GUI = GUICreate("Process Information v0.40 Beta by UEZ - Press ESC to quit! Just do some calculations...", 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()

    [/autoit] [autoit][/autoit] [autoit]

    $ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", $Process_All_Access, "int", False, "dword", $PID)
    $ProcHandle = $ProcHandle[0]

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $CPUTime = _GetProcTime($ProcHandle)
    $mem = _ProcessGetMem($ProcHandle) / 1024
    $hour = Int($CPUTime / 10000000 / 3600)

    [/autoit] [autoit][/autoit] [autoit]

    $minutes = Int($CPUTime / 10000000 / 60)
    If $minutes < 10 Then $minutes = "0" & $minutes

    [/autoit] [autoit][/autoit] [autoit]

    $seconds = Round((Int($CPUTime / 10000000) / 60 - Int($CPUTime / 10000000 / 60)) * 60, 0)
    If $seconds < 10 Then $seconds = "0" & $seconds

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    $info = @CR & $fname & " | PID: " & $PID & " | CPU time: " & $hour & ":" & $minutes & ":" & $seconds & "." & $milliseconds & " (h:m:s.ms) | Mem usage: " & $mem & " KB | CPU usage: " & $Process_CPU_Usage & " % " & @CR
    MemoWrite($info)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(1000)
    If Not ProcessExists($PID) Then _Exit()
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func MemoWrite($sMessage = "")
    GUICtrlSetData($iMemo, $sMessage)
    EndFunc ;==>MemoWrite

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func _ProcessGetMem($ProcessHandle) ;get physical memory of the process -> http://msdn.microsoft.com/en-us/library/…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; dword_ptr PeakWorkingSetSize; dword_ptr WorkingSetSize; " & _
    "dword_ptr QuotaPeakPagedPoolUsage; dword_ptr QuotaPagedPoolUsage; dword_ptr QuotaPeakNonPagedPoolUsage; " & _
    "dword_ptr QuotaNonPagePoolUsage; dword_ptr PagefileUsage; dword_ptr PeakPagefileUsage") ;http://msdn.microsoft.com/en-us/library/…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; dword_ptr PeakWorkingSetSize; dword_ptr WorkingSetSize; " & _
    "dword_ptr QuotaPeakPagedPoolUsage; dword_ptr QuotaPagedPoolUsage; dword_ptr QuotaPeakNonPagedPoolUsage; " & _
    "dword_ptr QuotaNonPagePoolUsage; dword_ptr PagefileUsage; dword_ptr PeakPagefileUsage; " & _
    "dword_ptr PrivateUsage") ;http://msdn.microsoft.com/en-us/library/…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

    [/autoit] [autoit][/autoit] [autoit]

    Func CPU() ;get logical CPU(s)
    Local $sLPSystemInfo = DllStructCreate( "ushort dwOemId;" & _
    "short wProcessorArchitecture;" & _
    "dword dwPageSize;" & _
    "ptr lpMinimumApplicationAddress;" & _
    "ptr lpMaximumApplicationAddress;" & _
    "long_ptr dwActiveProcessorMask;" & _
    "dword dwNumberOfProcessors;" & _
    "dword dwProcessorType;" & _
    "dword dwAllocationGranularity;" & _
    "short wProcessorLevel;" & _
    "short wProcessorRevision")
    Local $aResult = DllCall("Kernel32.dll", "none", "GetSystemInfo", "ptr",DllStructGetPtr($sLPSystemInfo))
    If @error Or Not IsArray($aResult) Then Return SetError(1, 0, 0)
    Return DllStructGetData($sLPSystemInfo, "dwNumberOfProcessors")
    EndFunc ;==>CPU

    [/autoit] [autoit][/autoit] [autoit]

    Func Remove_Last_Comma($str)
    If StringRight($str, 2) = ", " Then $str = StringMid($str, 1, StringLen($str) - 2)
    Return $str
    EndFunc ;==>Remove_Last_Comma

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    DllCall("kernel32.dll", "int", "CloseHandle", "int", $ProcHandle)
    DllCall("psapi.dll", "int", "CloseHandle", "hwnd", $ProcHandle)
    ProcessClose($PID)
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Es wird ein Dummy AU3 erstellt, kompiliert und gestartet und dessen CPU Auslastung gemessen.

    Sollte auch auf Win7 x64 laufen.

    Gruß,
    UEZ

  • Mit AutoIt ist es nicht möglich die CPU Last auf alle Kerne zu verteilen, d.h. es wird immer "nur" ein Core eingeheizt.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯