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.
#include <Process.au3>
#include <Date.au3>
#include <Array.au3>
dim $sammelarr[40][3]
dim $zaehler = 0
#cs
Die zu ueberwachenden Prozesse
#ce
$re = _processUpTime("Test.exe")
$re = _processUpTime("Test2.exe")
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
; 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
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