Mehrere Instanzen eines Programms nacheinander starten und beenden

  • Hi,

    ich schreibe gerade an einem Tool, dass mir mehrere Instanzen eines Programms aus verschiedenen Ordnern nach einander startet, eine bestimmte Zeit abwartet, sie dann wieder schließt und das nächste startet.

    Das funktioniert auch alles. Beim Start meines Tools müssen zunächst die Ordner der Instanzen und die Wartezeit angegeben werden.

    Mein Problem ist eigentlich nur, dass man im Moment noch auf eine bestimmte Anzahl von Instanzen festgelegt ist. Ich würde also gern die Anzahl vorher eingeben lassen und dann eine Schleife ausführen. Allerdings weiß ich nicht so recht, wie ich das bewerkstelligen soll, da ich ja dann vorher eine dynamische Anzahl von Variablem (die jeweiligen Programmpfade) eingeben lassen muss.

    Hier mal der Code

    Außerdem wüßt ich gern, ob es möglich ist mehrere Variablen in einer Inputbos einzugeben. (ist aber nicht so wichtig)


    Ich beschäftige mich erst seit kurzem mit AutoIt.
    Daher wär ich für jede Hilfe dankbar.

    3 Mal editiert, zuletzt von dasT17 (1. Oktober 2008 um 19:58)

  • Genau,

    also es müssten 2 Schleifen sein, denke ich

    -Anzahl der Programme abfragen
    -Schleife mit genau dieser Anzahl von Pfadabfragen -> merken
    -Abfragen und merken der Zeit (is immer die selbe)
    -Schleife, die Programme+Wartezeit ausführt

    dasT17

  • Gib mir nur mal nen Tipp, wie ich das anstelle, dass sich die mc-Variable bei jedem Schleifendurchlauf erhöht, dann krieg ichs vllt hin.

    Hab nur vor Jahren mal bissl VB gemacht und nun vor 2 Tagen mit AutoIt angefangen, daher fehlen mir wohl n paar Grundlagen. Weiß ja im Prinzip, dass es nix großes is.

    • Offizieller Beitrag

    Hi,

    habe keine Zeit mehr, aber die schnell eine Starthilfe generiert.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $GUI = GUICreate("GUI", 351, 119, 193, 125)
    GUICtrlCreateGroup("", 5, -5, 340, 120)
    GUICtrlCreateLabel("Path", 15, 15, 26, 17)
    $path_I = GUICtrlCreateInput("", 65, 15, 201, 21)
    GUICtrlCreateLabel("Duration", 15, 40, 83, 17)
    $duration_I = GUICtrlCreateInput("", 65, 40, 121, 21)
    GUICtrlCreateLabel("Min", 15, 70, 46, 17)
    $min_I = GUICtrlCreateInput("", 65, 65, 121, 21)
    GUICtrlCreateLabel("Max", 15, 95, 36, 17)
    $max_I = GUICtrlCreateInput("", 65, 90, 121, 21)

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

    $browse = GUICtrlCreateButton("Browse", 270, 15, 70, 20, 0)
    $next_B = GUICtrlCreateButton("Next", 195, 40, 145, 20, 0)
    $view_B = GUICtrlCreateButton("View", 195, 65, 145, 20, 0)
    $start_B = GUICtrlCreateButton("Start", 195, 90, 145, 20, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $path_A[1], $min_A[1], $max_A[1], $duration_A[1]

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $browse
    $re = FileOpenDialog('', @ScriptDir, 'All (*.*)')
    If Not @error Then GUICtrlSetData($path_I, $re)
    Case $next_B
    _ArrayAdd($path_A, GUICtrlRead($path_I))
    _ArrayAdd($duration_A, GUICtrlRead($duration_I))
    _ArrayAdd($min_A, GUICtrlRead($min_I))
    _ArrayAdd($max_A, GUICtrlRead($max_I))
    GUICtrlSetData($path_I, '')
    GUICtrlSetData($duration_I, '')
    GUICtrlSetData($min_I, '')
    GUICtrlSetData($max_I, '')
    Case $view_B
    Local $a[UBound($path_A)][4]
    For $i = 0 To UBound($path_A) - 1
    $a[$i][0] = $path_A[$i]
    $a[$i][1] = $duration_A[$i]
    $a[$i][2] = $min_A[$i]
    $a[$i][3] = $max_A[$i]
    Next
    _ArrayDisplay($a)
    EndSwitch
    WEnd

    [/autoit]

    Mega

  • Danke erstmal für die Mühe.

    Meins läuft inzwischen. Bin auch auf das Array gekommen.
    Hier die 2 Schleifen

    Habs aber noch mit inputboxes, werde versuchen es mit GUI hinzukriegen.
    Ist ja doch konfortabler. Nun kenn ich ja den Code dazu.

  • Hi,
    einen Tip um das GUI zu erstellen besorg dir das Tool KodaForm Designer. Damit geht es um einiges schneller und schöner.

    Eins noch, wenn du Autoit-Quelltext postest klicke mal anstatt auf das PHP-Logo auf das Autoit-Logo. dann massen auch die Syntax-Highlits. ;)

    MfG
    Der_Doc

  • Danke für den Tipp mit KodaForm.
    Bin schon gut damit vorangekommen.
    Habe es auch wieder hinbekommen, dass alle Einstellungen in eine .ini gespeichert werden, wie ichs auch ohne GUI schon hatte.
    Auch ein Programm wird gespeichert, mehrere allerdings nicht. Außerdem überleg ich grad, wie ich die dann vorher wieder einlese.
    Hatte vorher ne For-Schleife, wo man vorher angeben musste, wieviele es sind.

    Spoiler anzeigen
    [autoit]


    Global $mc_A[1]

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    IniWrite($IniFile , "Options" , "mc_run" , GUICtrlRead($mc_run))
    IniWrite($IniFile , "Options" , "d_min" , GUICtrlRead($d_min))
    IniWrite($IniFile , "Options" , "d_max" , GUICtrlRead($d_max))
    Exit
    Case $browse_mc
    $mc_browse = FileOpenDialog('', @ScriptDir, 'All (*.*)')
    If Not @error Then GUICtrlSetData($new_mc, $mc_browse)
    Case $Add
    _ArrayAdd($mc_A, GUICtrlRead($new_mc))
    IniWrite($IniFile , "programs" , "mc" & _ArrayMax($mc_A)+1, GUICtrlRead($new_mc))
    GUICtrlSetData($new_mc, '')
    EndSwitch
    WEnd

    [/autoit]

    Kann mir bitte nochmal jemand auf die Sprünge helfen?

  • Äm sorry helf mir mal auf die Sprünge, was dein Problem genau ist. Und was meinst du mit

    Zitat

    Auch ein Programm wird gespeichert, mehrere allerdings nicht.


    das verstehe ich leider net so richtig.

    Du liest Werte aus einem GUI in eine INI-Datei, wählst Ordner aus und fügst die auch der INI-Datei hinzu ... aber warum?

    MfG
    Der_Doc

  • Auch ein Programm wird gespeichert, mehrere allerdings nicht.

    Ich meine damit die Pfade der Programminstanzen, die nacheinander ausgeführt werden sollen.
    Dafür habe ich jetzt ne imputbox mit Browse-Button und dann noch einen "Add"-Button, der den Pfad aus der Imputbox in ein Array schreibt
    und diesen Array-Eintrag auch gleich noch in die .ini speichert. Hierbay wird aber immer nur die erste Zeile des Arrays überschrieben statt neue hinzugefügt. Ich versehe nur nicht warum.

  • Zitat

    Wieso schreibst du das eigentlich erst in ein Array?

    Na weil es mehrere Programminstanzen sind und man immernoch welche hinzufügen können soll.
    Das mit dem Speichern klappt jetzt aber.

    Spoiler anzeigen
    [autoit]

    Global $mc_A[1]

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    IniWrite($IniFile , "Options" , "mc_run" , GUICtrlRead($mc_run))
    IniWrite($IniFile , "Options" , "d_min" , GUICtrlRead($d_min))
    IniWrite($IniFile , "Options" , "d_max" , GUICtrlRead($d_max))
    Local $mc[UBound($mc_A)][1]
    For $i = 0 To UBound($mc_A) - 1
    $mc[$i][0] = $mc_A[$i]
    If $i > 0 Then
    IniWrite($IniFile , "Programs" , "mc" & $i, $mc[$i][0])
    EndIf
    Next
    Exit

    [/autoit]

    Aber wie kann ich die, die schon gespeichert sind beim Programmstart in $mc_A Array laden?
    -----------
    OK habs.

    Einmal editiert, zuletzt von dasT17 (29. September 2008 um 12:44)

  • Soo, muss doch nochmal was fragen:

    Hab das script noch bissl verbessert, so dass es für alle arten von programmen funktioniert.
    Jetzt habe ich aber ein Problem mit dem Beenden.

    Zuerst hatte ich es mit WinClose. Da man aber nicht immer den Titel kennt, bin ich aus ProcessClose umgestiegen.
    den Prozessnamen lasse ich nun aus dem Pfad, den man ja vorher angeben muss einlesen - das klappt eigentlich auch gut,
    aber ich habe nicht bedacht, dass es programme gibt, die einen anderen Prozessnamen haben als ihren Dateinamen.

    Gibt es eine Alternative?
    Kann ich vllt. den Prozessnamen, die ProzessID oder den Titel irgendwie beim öffnen des Programms ermitteln?

    Danke schonmal!

  • Ja danke, das klappt, nur leider ist das eine Proggi anscheinend java - wenn das gestartet wird läuft ein prozeß namens jawaw.exe und der hat nicht die PID, die die programm.exe bei Run zurück gibt. naja hab diese Ausnahme erstmal mit ner if-Abfrage gelöst.

    [autoit]


    If ProcessExists($pid) Then
    ProcessClose($pid)
    Elseif ProcessExists("javaw.exe") Then
    ProcessClose("javaw.exe")
    Else
    MsgBox(0,"Error", "Unknown process")
    EndIf

    [/autoit]

    Funktioniert nun natürlich nur mit jawa als Ausnahme, weiß aber gar nicht, ob überhaupt noch andere Beispiele dafür gibt.
    Gäbs noch ne andere Möglichkeit, auf den Prozess zu kommen?

  • Noch ein Problem - hab noch 2 Funktionen eingebaut, um das ganze zu verschönern

    zum Tray minimieren

    Spoiler anzeigen
    [autoit]

    ;Tray minimize function
    Func _minimizeToTray ()
    Opt('TrayIconHide', 0) ; Tray-Menü anzeigen
    TraySetIcon(@SystemDir & '\shell32.dll', -24) ; Icon für Tray-Menü setzen
    GUISetState(@SW_HIDE, $GUI) ; Fenster verstecken
    While 2 ; Tray-Menü-Schleife
    Switch TrayGetMsg() ; Anhand des eingetretenen Tray-Ereignisses die entsprechenden Befehle ausführen
    Case $TrayShow ; wurde 'Anzeigen' aufgerufen, dann...
    Opt('TrayIconHide', 1) ; Tray-Menü wieder verstecken
    GUISetState(@SW_SHOW, $GUI) ; Fenster anzeigen
    GUISetState(@SW_RESTORE, $GUI) ; und wiederherstellen (minimieren rückgängig machen)
    ExitLoop ; Tray-Menü-Schleife verlassen
    Case $TrayExit ; Benutzer hat 'Beenden' ausgewählt
    _save()
    Exit ; Programm beenden
    EndSwitch
    WEnd
    EndFunc

    [/autoit]

    und ein Contdown statt sleep während die Programme laufen

    Spoiler anzeigen
    [autoit]

    Func _ende() ; damit kann beendet werden, auch wenn der Timer läuft ==> hat kleine Verzögerung
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
    if $save = 1 Then
    _save()
    Exit
    Else
    Exit
    EndIf
    EndIf
    EndFunc

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Funktion _CountDown($SEC [, $MIN=0 [, $HOUR=0 [, $DAY=0 [, $VISIBLEDOWN=True [, $ALTERNATECTRL='TT']]]]])
    ;
    ; Beschreibung zählt vorgegebene Zeitspanne (Tage, Stunden, Minuten, Sekunden) herunter mit Anzeige Tooltip (Standard)
    ; oder Ausgabe in GUI-Ctrl; wahlweise Anzeige von Restzeit (Standard) oder abgelaufener Zeit
    ;
    ; Parameter $SEC: Sekunden
    ; optional $MIN: Minuten
    ; optional $HOUR: Stunden
    ; optional $DAY: Tage
    ; optional $VISIBLEDOWN: Ansicht (herunterzählen/heraufzählen)
    ; optional $ALTERNATECTRL: GUI-Ctrl in das die Ausgabe mittels GUICtrlSetData() ausgegeben wird
    ;
    ; Erfordernisse #include <Date.au3>
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    #include <Date.au3>
    Func _CountDown($SEC, $MIN=0, $HOUR=0, $DAY=0, $VISIBLEDOWN=True, $ALTERNATECTRL='TT')
    $Sekunden = $SEC + $MIN*60 + $HOUR*3600 + $DAY*86400
    $end = _DateAdd('s', $Sekunden, _NowCalc())
    Local $message
    Do
    _ende()
    Sleep(100)
    $sec = _DateDiff('s', _NowCalc(), $end)
    If Not $VISIBLEDOWN Then
    $secShow = $Sekunden - $sec
    Else
    $secShow = $sec
    EndIf
    Select
    Case $secShow < 60
    If $ALTERNATECTRL = 'TT' Then
    ToolTip(StringFormat('%02u', $secShow) & ' s')
    Else
    GUICtrlSetData($ALTERNATECTRL, StringFormat('%02u', $secShow) & ' s')
    EndIf
    Case $secShow < 60*60
    $message = StringFormat('%02u', Floor($secShow/60)) & ':' & _
    StringFormat('%02u', Mod($secShow,60)) & ' min'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    Case $secShow < 60*60*24
    $message = StringFormat('%02u', Floor($secShow/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod($secShow,3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod($secShow,3600),60)) & ' h'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    Case Else
    $message = Floor($secShow/86400) & ' d / ' & _
    StringFormat('%02u', Floor(Mod($secShow,86400)/3600)) & ':' & _
    StringFormat('%02u', Floor(Mod(Mod($secShow,86400),3600)/60)) & ':' & _
    StringFormat('%02u', Mod(Mod(Mod($secShow,86400),3600),60)) & ' h'
    If $ALTERNATECTRL = 'TT' Then
    ToolTip($message)
    Else
    GUICtrlSetData($ALTERNATECTRL, $message)
    EndIf
    EndSelect
    Until $sec = 0
    EndFunc ;==>_CountDown

    [/autoit]

    Nun wollt ich noch die Option automatisch beim Pogrammstart minimieren und starten

    Wenn ich einfach for die While-Schleife

    [autoit]

    ControlClick($GUI, "", $Start)

    [/autoit]


    schreibe, funktioniert das gut, aber wenn ich direkt danach _minimizeToTray ausführe, startet das 1. Programm und der Coutdown erst, wenn ich das Fenster wiederherstelle. Hab auch schon versucht _minimizeToTray mit in $Start reinzupacken, aber funt auch nicht. Kann mir nochmal jemand helfen? T