Prozesse Kontrollieren

  • Hallo,

    erstmal zur Probelmstellung:

    Ich möchte ein Programm schreiben das bestimmte Prozesse überwacht sich diese schnappt schaut wie lange die schon laufen und dann nach Priorität sortiert (die die am längsten laufen sollen als erste abgearbeitet werden(nachdem sie ihren Job gemacht haben, beenden sich diese)), die restilchen Prozesse sollen derweil blockiert werden.

    Ich hab mir die ProcessUptime Funktion von Xeno geschnappt und diese um die Ausgabe der Millisekunden erweitert. Da die Prozesse manchmal fast zur selben Zeit gestartet werden.

    Hab das auch schon in 2D Arrays gepackt und jetzt zeigt er mir an das die Größe nicht passt.
    Es sind auch einige Debug MsgBoxen drin die hab ich hier ausgeklammert.

    [autoit]


    #include <Process.au3>
    #include <Date.au3>
    #include <Array.au3>

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

    dim $sammelarr[40][3]
    dim $zaehler = 0

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

    #cs
    Die zu ueberwachenden Prozesse
    #ce
    $re = _processUpTime("Test.exe")
    $re = _processUpTime("Test2.exe")

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

    Func _processUpTime($exe)
    ; Wenn der Prozess nicht existiert, Sofort mit 0 beenden
    If not ProcessExists($exe) Then Return 0
    ;Prozessname wird in ' Anführungszeichen ' gesetzt
    Local $process = '"' & $exe & '"'
    ; Ein WMI-Objekt wird erstellt
    Local $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
    ; Aus der WMI-Tabelle Win32_Process wird der Prozess mit dem Angegebenen Prozessname abgefragt
    Local $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Process Where NAME = " & $process & "", "WQL", 0x10 + 0x20)

    ; Wenn die Rückgabe der Abfrage kein Objekt ist, beende mit -1
    If Not IsObj($colItems) Then Return -1

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


    ; Array für die Rückgabe erstellen
    Local $return[1][3], $counter = 0
    ; Für jedes Eigenschaft (Hier alles Objekte) im Objekt das flogende tun:
    ; wenn der Counter größer als 0 ist, dann gibt es mehrere Prozesse mit gleichem Namen, also Array erweitern.
    For $objItem In $colItems
    If $counter > 0 Then ReDim $return[$counter + 1][2]
    ;MsgBox(0,"Schleifestartet","Schleifi!!!")

    #cs
    Millisekunden auslesen
    #ce
    $milsekproc = StringMid($objItem.CreationDate, 16,3)

    #cs
    Zeitunterschied in Sekunden vom aktuellenm Datum zum Erstellunsdatum des Prozesss ( Dieses wird aus dem String CreationDate des Objekts extrahiert. )
    Dieses ist folgendermaßen aufgebaut: YYYYMMDDhhmmss.??????+???
    #ce
    $iDateCalc = _DateDiff('s', StringLeft($objItem.CreationDate, 4) & "/" & StringMid($objItem.CreationDate, 5, 2) & "/" & StringMid($objItem.CreationDate, 7, 2) _
    & " " & StringMid($objItem.CreationDate, 9, 2) & ":" & StringMid($objItem.CreationDate, 11, 2) & ":" & StringMid($objItem.CreationDate, 13, 2), _
    @YEAR & '/' & @MON & '/' & @MDAY & ' ' & @HOUR & ':' & @MIN & ':' & @SEC)
    ;MsgBox(0,"DateCalc","Calc" & " " & $counter)
    $return[$counter][0] = $objItem.ProcessId
    $return[$counter][1] = $iDateCalc
    $return[$counter][2] = $milsekproc
    _ArrayDisplay($return)
    ;MsgBox(0,"retarr","retarr")
    ; Counter für eventuellen nächsten Durchlauf erhöhen
    Msgbox(0,"zahle",$zaehler)
    _ArrayDisplay($sammelarr)
    $sammelarr[$zaehler][0] = $objItem.ProcessId
    $sammelarr[$zaehler][1] = $iDateCalc
    $sammelarr[$zaehler][2] = $milsekproc
    ;_ArrayDisplay($sammelarr)
    $counter += 1
    $zaehler += 1
    ;MsgBox(0,"coutnzahl",$counter & @CRLF & $zaehler)
    Next
    ; Ergebnisse zurückgeben

    Msgbox(0,"zahle",$zaehler)
    Return $return
    EndFunc ;==>_processUpTime

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

    Ich bitte das durcheinander im code zu entschuldigen bin grad ein bisschen wirr am teste ; )

    Wenn mir jemand sagen könnte wo der Fehler liegt ?(;(

    Wahrscheinlich seh ich`s nur nicht.

    bis denne,
    haut rein,
    Todd

    Einmal editiert, zuletzt von Hotrod_Todd (17. Dezember 2009 um 09:42)

  • Hi,

    If $counter > 0 Then ReDim $return[$counter + 1][2]
    muss heissen
    If $counter > 0 Then ReDim $return[$counter + 1][3]

    ;-))
    Stefan

  • @ ojo: :thumbup: Danke, war mal`n typischer Fall von 'Betriebsblindheit', wie man wohl so sagt.

    Nun würd ich dieses Thema gerne Schließen, aber find nix wie`s geht.

    Einmal editiert, zuletzt von Hotrod_Todd (17. Dezember 2009 um 08:49)