WinWait auf einen Prozess bis CPU-Auslastung 0%

  • Hallo,

    Dumme Frage:
    gibt es eine einfache Lösung um ein WinWait auf einen Prozess zu machen bis die CPU-Auslastung von diesem Prozess 0% beträgt?

    MFG Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • hallo,

    irgendwie find ich nichts vergleichbares! HAst du mal nen Link zu sonem Thema
    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • hi,

    ja das einen habe ich dann auch gefunden. Leider will es aber nicht recht laufen.

    [autoit]

    #include <process.au3>

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

    Global $process = "firefox.exe"

    While 1
    Sleep(10)
    $cpu_usage = _Get_CPU_Usage(@ComputerName, 0, $process); return usages if smaller the percent passed in
    If Not @error Then
    ToolTip("CPU Usage of " & $process & @CRLF & "IDLE : " & $cpu_usage & " %" , 0, 0, "CPU USAGE", 1)
    ExitLoop
    EndIf
    WEnd

    Func _Get_CPU_Usage($strComputer, $percent = 5, $strProcess = "")
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""

    If $strProcess <> "" Then $strProcess = " WHERE Name = '" & $strProcess & "'"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process" & $strProcess, "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    If IsObj($colItems) Then
    For $objItem In $colItems
    If Number($objItem.PercentProcessorTime) > Number($percent) Then Return $objItem.PercentProcessorTime
    Next
    EndIf
    SetError(1)
    Return ""
    EndFunc ;==>_Get_CPU_Usage

    [/autoit]

    Ist es möglich es etwas näher zu erklären was geschieht. Ich habe es laufen lassen aber bei mir geschieht nix.


    Taucher


    PS. hat wer ne Erklärung

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    Einmal editiert, zuletzt von taucher_2006 (15. August 2007 um 13:20)

  • Hallo Taucher.

    Also ich mache es immer so, wenn ich ein Script versuchen möchte etwas näher zu verstehen.

    Die Worte, zu den man eine erklärung bekommen kann, sind ja in Deinem Script hier beid er Veröffentlichung unter strichen und ich kliche die an, die ich nicht verstehe. Daraus lernt man einiges und versteht dann vielleicht bischen ebsser was passiert.

    Dazu kommt, das ich gesehen habe, das Du an einigen Stellen dreifache Anführungsstriche hast, wobei ich nicht sagen kann, ob das so richtig ist. Einfach, also zwei "Hochkommas" oder ein einzelndes "Hochkomma" kenne ich, aber drei "Hochkommas" direkt hintereinander, ich meine das ist so nicht ganz richtig, aber da einfach selber mal bischen die deutsche Hilfe durchgehen.

    Gruß, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • hi,

    danke damit habe ich mich beschäftigt. Nur es möchte nicht laufen. Es ist so original aus einem Thema hier im Forum übernommen. Ich würde es gerne einsetzen wenn es denn läuft. Dazu würde ich gerne ein paar klärende Worte haben.

    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • Das einzige was am Programm falsch ist, ist die zweite Zeile -
    schreibe statt:
    Global $process = "firefox.exe"

    Global $process = "firefox"
    dann geht es auch.

    Erklärung?
    Nun ja etwas komplizierter. Die Funktion _Get_CPU_Usage fragt über die "Windows Management Instrumentations" (kurz WMI) die "PercentProcessorTime" des angegbenen Tasks über die Performance Daten von "Win32_PerfFormattedData_PerfProc_Process" ab.

    Siehe auch:
    http://de.wikipedia.org/wiki/Windows_M…nstrumentations


    Dies geschieht darüber, daß du erst ein entsprechendes Objekt erzeugst:
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")

    und über dieses per $objWMIService.ExecQuery die Daten abfrägst. (ist diese SQL Anweisung: "SELECT * FROM Win32_PerfFormattedData_PerfProc_Process WHERE=firefox".)

    Damit frägst du alle Daten von "Win32_PerfFormattedData_PerfProc_Process" über den angebenen Process ab.

    Diese Informationen kannst du dann alle erhalten:
    http://msdn2.microsoft.com/en-us/library/aa394277.aspx

    Und die "PercentProcessorTime" wird dann einfach als Tooltip ausgeben, wenn sie diesen voreingestellten Wert ($percent ) überschreitet.


    So ich hoffe ich habe da nix falsches erzählt :D

    Grüße
    Stilgar

  • hi,

    danke das war doch recht hilfreich. Nun habe ich mal hier Excel genommen und hier eine Änderung vorgenommen $percent = 25 eine ander Zahl eingegenen. Doch es tut sich rein garnichts. Excel geht weit über die 25% hinnaus. Was mache ich noch falsch das ich kein Ergebniss sehe?

    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • Schwer zu sagen. Hab grad kein Excel zur Hand. Wie heißt es denn im Taskmanager?

    Zur besseren Funktionskontrolle nimm mal aus der While-Schleife dieses ExitLoop heraus, dann siehst du besser was der Prozess gerade "macht".

    Und die erste Zeile #include <Process.au3> ist auch überflüssig, da keine Funktion daraus verwendet wird.

    Grüße
    Stilgar

  • hi,

    ja ich weis nicht weiter. Habe auch firefox genommen und das EXITLOOP raus genommen aber nichts.
    :weinen:
    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • Das ist komisch, manche WMI Sachen gehen zwar nicht überall, aber das hier ist ja nichts besonderes.

    Probiers mal so:

    Spoiler anzeigen
    [autoit]

    Global $process = "firefox"

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

    While 1
    Sleep(100)
    $cpu_usage = _Get_CPU_Usage(@ComputerName, 0, $process); return usages if smaller the percent passed in
    If Not @error Then
    ToolTip("CPU Usage of " & $process & @CRLF & "IDLE : " & $cpu_usage & " %" , 0, 0, "CPU USAGE", 1)
    EndIf
    WEnd

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

    Func _Get_CPU_Usage($strComputer, $percent = 0, $strProcess = "")
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""

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

    If $strProcess <> "" Then $strProcess = " WHERE Name = '" & $strProcess & "'"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")

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

    If @error Then
    MsgBox(0, "WMI Output", "Can't create WMI object")
    SetError(1)
    Return -1
    EndIf

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

    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process" & $strProcess, "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) Then
    For $objItem In $colItems
    If Number($objItem.PercentProcessorTime) > Number($percent) Then Return $objItem.PercentProcessorTime
    Next
    Else
    MsgBox(0, "WMI Output", "Win32_PerfFormattedData_PerfProc_Process")
    SetError(1)
    Return -1
    EndIf

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

    EndFunc ;==>_Get_CPU_Usage

    [/autoit]


    und mach dabei irgendwas mit Firefox, dann sollte sich die Anzeige des Tooltips ändern, falls vorher keine Fehlermeldung kommt.

  • Nach einem Boot ist alle wieder gut. Es geht weis der Geier was mein Rechner hatte. Nun muss ich es nur hinbekommen das die Überwachung des Programmes geht, damit das WinWait richtig geht. Es soll ja weiter gemacht werden wenn das Programm die CPU mit 0% belastet.

    Taucher :evil:

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D