Programmstarter - Wie kann ich das machen

  • Hallo Leute,
    ich bin neu im Bereich AutoIt und möchte gerne ein kleines Programm schreiben.

    Meine Idee ist es einen Programmstarter zu schreiben, der aus einer .ini Datei die Programmenamen, den Programmpfad und einen Timer ausliest.
    Die Programmnamen sollen im Button angezeigt werden.
    Die Programmpfade dienen zu starten der Programme.
    Der Timer soll dazu sein, um die Programme nach einer bestimmten Zeit nacheinander zu starten.

    Die einzelnen Programmbuttons sollen jeweils anzeigen (in grün) ob das Programm gestartet wurde.
    Ich würde es gerne so machen, das wenn ein Programm abgestürtzt oder Eingefroren ist, das alle Programme automatisch gekillt werden und neu gestartet werden.

    Start= Alle Programme sollen gestartet werden.
    Re-Start= Alle Programme sollen gekillt werden und neu gestartet werden.
    Stop= Alle Programme sollen gekillt werden.

    Im Filemenu ist ein Config-Button, wo man dann alle Sachen einstellen sollte und das in der .ini gespeichert können sollte.

    Leider bin ich nicht der Profiprogrammierer und fange ja grade erst an.
    Ich würde mich echt freuen, wenn mir einer dabei behilflich ist.
    Vielen dank schon einmal.

    Als Anhang mal das was ich bis jetzt geschafft habe, ist nicht wirklich viel...

    2 Mal editiert, zuletzt von Ram3000 (5. Januar 2015 um 18:48)

  • Das hilft eingefrorene Prozesse zu finden,
    hab ich von meinem Script rauskopiert,
    du musst das nur noch mit einer Uhr verbinden weil es prüft zbs. nur jede Minute ob was steckt.

    Spoiler anzeigen
    [autoit]


    If GUICtrlRead($Checkbox_Taskkiller) = 1 Then ;beim Button meiner GUI kann ich den Taskkiller Ein- und Ausschalten, 1=Ein
    Switch $Sec_imSpielzeit
    Case "10" ;bei Sekunde 10 wird jede Minute geprüft
    $Winlist = WinList() ;
    For $w = 1 to $Winlist[0][0]
    $title = $Winlist[$w][0]
    If $title = "[#] [" Or $title = "[#] Spielname [#]" Then
    $hWnd = $Winlist[$w][1]
    $IsHungAppWindow = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd) ;Prüfen ob was hängt
    If @error == 0 Then
    If $IsHungAppWindow[0] == 1 Then
    Sleep(10000) ;10 Sekunde Pause
    $IsHungAppWindow = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd) ;nach 10 Sekunden wird der Fund nochmal geprüft ob es wirklich hängt
    If @error == 0 Then
    If $IsHungAppWindow[0] == 1 Then
    ProcessClose(WinGetProcess($hWnd))
    IniWrite("Taskkill.ini", "Counter", "Wert", IniRead("Taskkill.ini", "Counter", "Wert", "")+1)
    IniWrite("Taskkill.ini", "ProcessClose", "Wert_"&IniRead("Taskkill.ini", "Counter", "Wert", ""), " " & @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & $hWnd & " " & $title)
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    Endswitch
    EndIf

    [/autoit]

    so bekam ich die uhrzeit in meine gui

    Spoiler anzeigen
    [autoit]


    $Uhrzeit = GUICtrlCreateLabel("", 158, 391, 80, 28, $SS_CENTER)
    AdlibRegister("Uhrzeittick", 1000)
    Func Uhrzeittick()
    GUICtrlSetData($Uhrzeit, _NowTime())
    EndFunc

    [/autoit]

    und das sind Codesnipsel meines Timers

    Spoiler anzeigen
    [autoit]


    $Label_Timer_Std = GUICtrlCreateLabel(IniRead("m47.ini", "Label_Timer_Std", "Wert", ""), 169, 419, 13, 28, $SS_CENTER) ;<--- Startzeit für Stunden
    GUICtrlCreateLabel(":", 182, 417, 3, 28, $SS_CENTER)
    $Label_Timer_Min = GUICtrlCreateLabel(IniRead("m47.ini", "Label_Timer_Min", "Wert", ""), 185, 419, 25, 28, $SS_CENTER) ;<---- Startzeit für Minuten
    AdlibRegister("Timertick", GUICtrlRead($Input_AdlibRegister_Timertick))
    $Input_Timer_Std_Alarm = GUICtrlCreateInput(IniRead("m47.ini", "Input_Timer_Std_Alarm", "Wert", ""), 212, 426, 15, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL)) ;7
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetOnEvent(-1, "Input_Timer_Std_AlarmChange")
    GUICtrlSetTip(-1, "Timer_Std_Alarm")
    $Input_Timer_Min_Alarm = GUICtrlCreateInput(IniRead("m47.ini", "Input_Timer_Min_Alarm", "Wert", ""), 227, 426, 25, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL)) ;50
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetOnEvent(-1, "Input_Timer_Min_AlarmChange")
    GUICtrlSetTip(-1, "Timer_Min_Alarm")
    $Checkbox_TimerAlarm = GUICtrlCreateCheckbox("Checkbox_TimerAlarm", 253, 431, 12, 12)
    GUICtrlSetState(-1, IniRead("m47.ini", "Checkbox_TimerAlarm", "Wert", ""))
    GUICtrlSetTip(-1, "TimerAlarm EIN/AUS")
    GUICtrlSetOnEvent(-1, "Checkbox_TimerAlarmClick")

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

    Func Timertick()
    If GUICtrlRead($Checkbox_TimerAlarm) = 1 Then
    If GUICtrlRead($Label_Timer_Std) = GUICtrlRead($Input_Timer_Std_Alarm) And GUICtrlRead($Label_Timer_Min) = GUICtrlRead($Input_Timer_Min_Alarm) Then
    Do
    Sleep(2000)
    SoundPlay(IniRead("m47.ini","Timertick","Wert","Timertick.wav"), 0)
    Until (GUICtrlRead($Label_Timer_Std) = "0" And GUICtrlRead($Label_Timer_Min) ="00") Or GUICtrlRead($Checkbox_TimerAlarm) = 4
    SoundPlay("", 0)
    EndIf
    EndIf
    If GUICtrlRead($Label_Timer_Min) = "59" Then
    GUICtrlSetData($Label_Timer_Min, "00")
    GUICtrlSetData($Label_Timer_Std, GUICtrlRead($Label_Timer_Std) + 1)
    IniWrite("m47.ini","Label_Timer_Std","Wert",GUICtrlRead($Label_Timer_Std))
    Else
    GUICtrlSetData($Label_Timer_Min, GUICtrlRead($Label_Timer_Min) + 1)
    Switch GUICtrlRead($Label_Timer_Min)
    Case 1 to 9
    GUICtrlSetData($Label_Timer_Min, "0"&GUICtrlRead($Label_Timer_Min))
    Endswitch
    IniWrite("m47.ini","Label_Timer_Min","Wert",GUICtrlRead($Label_Timer_Min))
    EndIf
    EndFunc

    [/autoit]

    mein Programm hat über 8000 Zeilen und schon lange her wie ich das machte bzw. schwierig alles reinzukopieren und aufzuschlüsseln, vielleicht kannste etwas damit anfangen

    Einmal editiert, zuletzt von m47 (5. Januar 2015 um 19:17)

  • @UliK
    Das von dir verlinkte Programm enthält keinen Source. Da Problem ist, dass es nichts bringt sich dein Programm anzusehen, da man Codetechnisch nicht weiter kommt. Ich bin sicher der TE hat bereits eine gewisse Vorstellung davon wie das Programm aufgebaut sein soll. Vielleicht wäre es ganz gut wenn du uns den Source zur Verfügung stellst, damit ließe sich besser arbeiten. :)

  • Danke Euch erstmal...

    Ich bin schon etwas weiter gekommen und der Code sieht sicherlich ganz schön übel aus ;) aber es läuft soweit...
    Aber die Prozessüberwachung ist *würg*, da komme ich einfach nicht so weiter...

    Ich wollte gerne eine Schleife haben, die bestimmte Programme/Prozesse überwacht
    und wenn mal ein Programme/Prozess eingefroren bzw beendet worden sein sollte,
    dann sollte das neu gestartet werden...ganz von allein ;)

    UliK: wäre nett wenn Du die Source noch hättest...

  • Befehle die ich für die Prozessüberwachung verwenden würde:
    1.) mit WinList kannste zbs. nach mehreren gleichen Fenstertiteln suchen, dass dein Script zbs. die Prozessüberwachung nur startet wenn diese Titel vorhanden sind
    2.) diese Codezeile fand ich im Internet, die prüft ob was hängt, "$hWnd" Variable kannste dabei benennen wie du willst, in dieser Variable steckt der Prozess der gefunden wurde

    Spoiler anzeigen
    [autoit]


    $IsHungAppWindow = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd)

    [/autoit]


    3.) und damit kannste den gefundenen Prozess "$hWnd" beenden

    Spoiler anzeigen
    [autoit]


    If $IsHungAppWindow[0] == 1 Then
    ProcessClose(WinGetProcess($hWnd))
    Enfif

    [/autoit]


    4.) ProcessExists - nach bestimmten Prozessen suchen
    5.) Schleife mit While Wend, Sleep(1000), ich würd die Suche dann so jede Minute ausführen lassen

    Beispiel:

    Spoiler anzeigen
    [autoit]


    ;Prozesse
    Dim $Prozesse[4]
    $Prozesse[1] = "notepad.exe"
    $Prozesse[2] = ""
    $Prozesse[3] = ""

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

    ;Titel
    Dim $Titel[4]
    $Titel[1] = "Download.txt - Editor"
    $Titel[2] = ""
    $Titel[3] = ""

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

    While 1 ; starte Schleife
    If ProcessExists($Prozesse[1]) Then ; Wenn das Programm Notepad.exe läuft dann mache...

    $IsHungAppWindow = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd)
    ;suche nach einem hängenden Fenster,
    ;wenn eins gefunden dann schreib den Titel in die Variable $hWnd und in die Variable $IsHungAppWindow schreib 1


    If $IsHungAppWindow[0] == 1 Then ; Wenn ein hängendes Fenster gefunden wurde(weil $IsHungAppWindow[0] den Wert 1 enthält)
    ; dann mache...
    If $hWnd = $Titel[1] Then ; Wenn der hängende Titel mit meinem übereinstimmt dann mache...
    ProcessClose(WinGetProcess($hWnd)) ; schliesse die Prozess ID des Titels der in der Variable $hWnd steckt
    EndIf
    EndIf

    EndIf
    Sleep(10000) ; Pause von 10 sekunden = fragt alle 10 sekunden ob Notepad.exe läuft
    WEnd

    [/autoit]

    vielleicht konnte ich dir helfen, wenn nicht musste die Programmierer fragen den ich bin keiner, ich mach das nur gelegentlich und nach 1 Jahr ist wieder fast alles vergessen:)

    3 Mal editiert, zuletzt von m47 (7. Januar 2015 um 21:00)

  • Schaue dir in der Hilfe mal die While Schleife an und dann auch noch die ProcessExists.

    [autoit]

    While 1
    If ProcessExists("notepad.exe") Then ; Wenn das Programm Notepad.exe läuft dann mache
    MsgBox(0, "Example", "Notepad is running.") ; diese Meldung hier und
    Exit ; beende die Abfrage
    EndIf
    Sleep(10000); Pause von 10 sekunden = fragt alle 10 sekunden ob Notepad.exe läuft
    WEnd

    [/autoit]

    Edit: Ups zu Langsam

    Einmal editiert, zuletzt von UliK (7. Januar 2015 um 20:33)

  • So langsam wird es was ;)

    m47: Super vielen danke...das gucke ich mir mal an !

    UliK: Danke Dir auch...

    Aber mal eine Frage dazu:
    Wird denn auch dabei geprüft ob ein Programm abgestürzt/eingefroren (Keine Rückmeldung) ist oder nur ob ein Programm existiert oder nicht?
    Ich möchte ja beides abfragen können, also ob ein Programm existiert und/oder ob es abgestürzt/eingefroren (Keine Rückmeldung) ist.

    Und wie kann ich ganz bewusst ein Testprogramm dazu bringen, das es abgestürzt/einfriert (Keine Rückmeldung) ?
    Mit Suspend geht das nicht so, da ja nur der Prozess pausiert, weil im Taskmanager zeigt er es als laufend an...

  • Ram3000

    diese Codezeile

    [autoit]


    $IsHungAppWindow = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd)

    [/autoit]


    prüft meines Wissens alle Programme auf Keine Rückmeldung/eingefroren.
    ich verstehe die Codezeile aber selbst nicht wirklich.
    Keine Ahnung was user32.dll, int, oder das alles soll weil ich mich mit sowas nur sehr wenig befasse.
    ich fand das vor 2 Jahren für mich selbst und erfüllte seinen Zweck hervorragend.
    Bei mir lief damals der Laptop den ganzen Tag.
    Wenn es keine Rückmeldung gab wurde Programm automatisch neu gestartet und der Absturzdatum+Uhrzeit+ID+Fenstertitel in eine *ini geschrieben.
    Beispiel:

    Spoiler anzeigen
    [autoit]

    If $IsHungAppWindow[0] == 1 Then
    ProcessClose(WinGetProcess($hWnd))
    IniWrite("Taskkill.ini", "Counter", "Wert", IniRead("Taskkill.ini", "Counter", "Wert", "")+1)
    IniWrite("Taskkill.ini", "ProcessClose", "Wert_"&IniRead("Taskkill.ini", "Counter", "Wert", ""), " " & @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & $hWnd & " " & $title)
    EndIf

    [/autoit]

    Bei mir stürzt Firefox ab und zu ab, vielleicht lässt sich das irgendwie mit einem Programm simulieren.

    2 Mal editiert, zuletzt von m47 (8. Januar 2015 um 12:48)

  • So weit mir bekannt wird nur geprüft ob das Programm da ist aber nicht ob es abgestürzt ist, da ist dann die Abfrage von m47 die Richtige.
    Steht hier beschrieben was sie macht.IsHungAppWindow function

    Wie man bewußt ein Programm zum Absturz bringt werde ich hier nicht Posten, kann man sehr viel Mist mit machen.


    MfG
    Uli

  • Du solltest aber nicht sofort bei der HangUp-meldung beenden.
    Das aufhängen entsteht dadurch, dass der Prozess nicht mehr auf Events antwortet. Das kann beispielsweise auch daran liegen, dass gerade eine komplizierte Berechnung gemacht wird.
    Das kannst du beispielsweise dadurch testen, dass du ein programm schreibst mit guigetmsg oder so. dann machst du ne for schleife darein, die sehr lange läuft. schon würde eine gui sich aufhängen ;)