ProcessList mit CPU-Last in %?

  • Hallo alle Zusammen,

    Ich suche eine Funktion wie ProcessList, nur zusätzlich würde mich zum Namen und der PID auch noch die prozentuale CPU-Last interessieren!

    Mein Problem ist das ich an einem Rechner teilweis nach dem Start 100% CPU last von einem Prozess habe, diesen möchte ich dann automatische beenden!

    LG Jochen

  • Der Prozess läuft nicht kurzfristig auf 100% sondern daueren, beeinträchtigt die Funktion ungemein.....

    Mit den SysInternels bin ich auch schon drüber gegangen - ohne Erfolg, da es mit der Startreihenfolge der Prozesse zusammenhängt, ist ein Prozess eines Treiber für einen Dongel den ich unbedingt brauche, nach beenden startet er sich neu, somti wäre das Problem dann gelöst.

    Hört sich aber nicht so an als ob jemand 'ne Idee

    • Offizieller Beitrag

    Hi,

    vielleicht hilft dir dies. Wenn 100 % erreicht dann würde ich kurz warten dann noch mal checken und wenn dann immer noch 100 % dann ProcessClose.

    Spoiler anzeigen
    [autoit]

    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Local $CenterWidth = (@DesktopWidth - 200) / 2
    Local $CenterHeight = (@DesktopHeight - 300) / 2

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

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")

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

    ; ============================================================================
    ; GUI Definition
    ; ============================================================================

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

    $gui = GUICreate("CPU Meter", 200, 300, $CenterWidth, $CenterHeight, -1, $WS_EX_TOPMOST)
    GUISetOnEvent(-3, "_Exit_Event", $gui)
    GUISetIcon(@SystemDir & "\shell32.dll", 12)

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

    GUICtrlCreateLabel("CPU1", 5, 3, 40, 20, $SS_CENTER)
    $progressbar_core1 = GUICtrlCreateProgress(10, 20, 30, 250, $PBS_VERTICAL)
    $label_core1 = GUICtrlCreateLabel("", 10, 275, 30, 20, $SS_CENTER)

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

    GUICtrlCreateLabel("CPU2", 55, 3, 40, 20, $SS_CENTER)
    $progressbar_core2 = GUICtrlCreateProgress(60, 20, 30, 250, $PBS_VERTICAL)
    $label_core2 = GUICtrlCreateLabel("", 60, 275, 30, 20, $SS_CENTER)

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

    GUICtrlCreateLabel("CPU3", 105, 3, 40, 20, $SS_CENTER)
    $progressbar_core3 = GUICtrlCreateProgress(110, 20, 30, 250, $PBS_VERTICAL)
    $label_core3 = GUICtrlCreateLabel("", 110, 275, 30, 20, $SS_CENTER)

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

    GUICtrlCreateLabel("CPU4", 155, 3, 40, 20, $SS_CENTER)
    $progressbar_core4 = GUICtrlCreateProgress(160, 20, 30, 250, $PBS_VERTICAL)
    $label_core4 = GUICtrlCreateLabel("", 160, 275, 30, 20, $SS_CENTER)

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

    GUISetState()

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

    ; ============================================================================
    ; Main Loop
    ; ============================================================================

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

    While 1
    $colItems = $objWMIService.ExecQuery ("SELECT LoadPercentage FROM Win32_Processor", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
    $i = 0
    For $objItem In $colItems
    If $i = 0 Then
    GUICtrlSetData($progressbar_core1, $objItem.LoadPercentage)
    GUICtrlSetData($label_core1, $objItem.LoadPercentage & "%")
    ElseIf $i = 1 Then
    GUICtrlSetData($progressbar_core2, $objItem.LoadPercentage)
    GUICtrlSetData($label_core2, $objItem.LoadPercentage & "%")
    ElseIf $i = 2 Then
    GUICtrlSetData($progressbar_core3, $objItem.LoadPercentage)
    GUICtrlSetData($label_core3, $objItem.LoadPercentage & "%")
    ElseIf $i = 3 Then
    GUICtrlSetData($progressbar_core4, $objItem.LoadPercentage)
    GUICtrlSetData($label_core4, $objItem.LoadPercentage & "%")
    EndIf
    $i += 1
    Next
    Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_Processor")
    EndIf
    WEnd

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

    ; ============================================================================
    ; Functions
    ; ============================================================================

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

    Func _Exit_Event()
    Exit
    EndFunc ;==>_Exit_Event

    [/autoit]

    Mega

  • Wie heist der Prozess ? Falls er svchost.exe heist könnte das mit dem Windows Update zusammenhängen (war bei mir auch so, einfach unter Systemsteuerung->Automatische Updates->Updates deaktivieren)

  • Auto. Update ist schon deaktivert!


    Die Idee mit 100% abfragen und dann ProzessClose ist genau das was ich
    machen will. Nur will ich eben zuerst ermitteln welcher Process (PID)
    die 100% verursacht und dann genau diesen mit ProzessClose abschießen!

    Aber wie kann ich die 100% feststellen!!!! mit ProzessList kommt eben nur der Name und die PID nicht die Prozessorlast!!!!


    LG

  • Da man diesen Thread bei Google findet, wenn man nach einer Lösung für diese Problem sucht (Anzeigen der CPU-Last), habe ich das Script hier "etwas" verkleinert. ;)

    [autoit]


    $wmi = ObjGet("winmgmts:\\localhost\root\CIMV2")
    $col = $wmi.ExecQuery("select * from win32_process where name = '"&$pName&"'")
    For $pro In $col
    MsgBox(0, "Test", $col.LoadPercentage)
    Next

    [/autoit]

    Edit:

    Hab das ganze nochmal ungeändert.

    Hier ist eine Liste mit allen Werten, die man auslesen kann:
    win32_process-Tabelle: http://msdn.microsoft.com/en-us/library/…2(v=vs.85).aspx

    win32_processor-Tabelle: http://msdn.microsoft.com/en-us/library/…3(v=VS.85).aspx
    In die Where-Clause kann ebenfalls jeder Wert eingebaut werden.

    So kann man z.B. Prozesse suchen, die eine hohe Last haben. (WHERE LoadPercentage > 90)

    Edit2:

    Und nochmal ein schönerer Nachtrag:

    Prozessauslastung auslesen

    [autoit]

    $wmi = ObjGet("winmgmts:\\.\root\cimv2")
    Local $refresher = ObjCreate("WbemScripting.SWbemRefresher")
    $cols = $refresher.AddEnum($wmi, "Win32_PerfFormattedData_PerfProc_Process" ).ObjectSet
    While 1
    Sleep(200)
    $refresher.Refresh
    For $proc In $cols
    If ($proc.IDProcess = ProcessExists("Skype.exe")) Then
    ToolTip($proc.PercentProcessorTime)
    EndIf
    Next
    WEnd

    [/autoit]

    3 Mal editiert, zuletzt von Pennywise (18. Februar 2011 um 17:15)