While Schleife entkommen...

  • Hey Leute, ich bin neu hier und habe mal eine Frage an euch:

    EDIT: hab das ganze mal verkürzt. Vielleicht schreckt das nicht so ab :D

    1. Ich habe eine GUI.
    2. Ich will einen VLC Stream abgreifen. Wenn der sich ändert soll der neue Stream angezeigt werden. Also dachte ich, ich brauche eine Schleife, in der sich alles abspielt, nachdem ich den Button "gui_stream" drücke.
    Problem: Wenn ich eine Schleife setze, funktioniert das Umschalten. Allerdings kann ich das Programm über das X nicht mehr schließen.

    FRAGE: Was muss ich tun, damit das Programm immer auf den SCHLIEßEN Button reagiert.

    Spoiler anzeigen
    [autoit]


    ;Nur mal ganz schematisch:
    ; Mit Koda erstellte GUI

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

    Opt("GUIResizeMode", $GUI_DOCKAUTO)
    $gui_main = GUICreate("GMStream", 195, 104, 339, 242)
    $gui_einstellungen = GUICtrlCreateMenu("Einstellungen")
    $gui_stream = GUICtrlCreateButton("Stream starten", 9, 8, 177, 65)
    GUISetState(@SW_SHOW)

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

    ; Programm gestartet
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ProcessClose("vlc.exe")
    Exit

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

    ; Hier beginnt glaube ich das Problem

    Case $gui_stream
    ShellExecute($VLC, $Playlist) ; Stream wird gestartet
    While 2
    if $GUI_EVENT_CLOSE Then ; DAS HATTE ICH EINGEFÜGT, ALS ICH GEMERKT HABE, DAS ICH NACH STREAMSTART NICHTS MEHR STEUERN KANN
    ExitLoop
    ProcessClose("vlc.exe")
    Exit
    Else
    ; jetzt kommen Befehle prüfen der Stream ID
    ; wenn sich die ändert soll der vlc Player erneut gestartet werden...
    ........
    WEnd
    EndSwitch
    WEnd

    [/autoit]


    Ich hab die folgende Tips bekommen:
    1. AdlibRegister ausprobieren. Da habe ich aber nicht gecheckt, wie ich das für mein Script einsetzen soll..
    2. Von MessageLoop in den OnEventMode umzusteigen (Opt("GUIOnEventMode", 1)).
    Habe ich nach dem Beispiel in der GUI-Referenz gemacht und alle Buttons von cases zu Funktionen gemacht und aus der Schleife rausgeholt. Aber ich mache das wohl falsch, weil ich den Stream jetzt nicht mehr starten kann (bei einem Versuch gestern meinte ich noch, ich hätte das geschafft).
    Grüße

    Grüße autoiter

    3 Mal editiert, zuletzt von autoiter (26. Februar 2014 um 14:51) aus folgendem Grund: Dankenswerterweise gelöst

  • Hallo Autoiter,

    Du solltest Dir über einige Funktionen und ihre Funktionalität zunächst grundsätzlich Klarheit verschaffen:

    Z. 23 Deines Codes würde ich als

    [autoit]

    If GUIGetMsg() == $GUI_EVENT_CLOSE Then

    [/autoit]

    schreiben; die Zeilen 25 und 26 können nicht zur Ausführung kommen, da die (zweite) Schleife mit

    [autoit]

    ExitLoop

    [/autoit]

    in Z. 24 verlassen wird.
    Prinzipiell befindet sich Dein Programm vom Start des Streams an in der (Endlos-)Schleife von Z. 22 bis Z. 31, sodass auf andere Ereignisse nicht mehr reagiert werden kann -- es sei denn, diese werden in der zweiten Schleife abgefragt.
    Diese Situation ist m. E. nicht zu empfehlen.

  • Danke dir meistertogo, deine Zeile hat mir da schon mal geholfen. Ich kann jetzt das Programm immer noch beenden. Naja, und du hast Recht, mir fehlt noch ziemlich viel Klarheit. Ich hab gedacht, ich lege einfach mal los und lerne dabei :rolleyes:

    Prinzipiell befindet sich Dein Programm vom Start des Streams an in der (Endlos-)Schleife von Z. 22 bis Z. 31, sodass auf andere Ereignisse nicht mehr reagiert werden kann -- es sei denn, diese werden in der zweiten Schleife abgefragt.

    Diese Situation ist m. E. nicht zu empfehlen.

    Der Hauptzweck des Programms ist ja, dass es einen Stream immer aktuell hält solange es läuft. Was wäre denn eine bessere Alternative zu meinem Vorgehen?

    Grüße

    Grüße autoiter

  • Danke nochmal für die Hilfe und den Ratschlag. Ich habe es beherzigt und die While 2 Schleife verworfen. Es klappt auch, indem ich prüfe, ob der VLC Player läuft und dann gegebenenfalls alles ausführen lasse, was ich vorher unter dem Button "Stream starten" hatte laufen lassen. Dort wird jetzt wirklich nur noch der Stream gestartet.

    Grüße autoiter

  • Aha, ich wollte das Thema als gelöst markieren, als ich meinen Bericht schrieb, dass es sich erledigt hat. Da hab ich die Option nicht gesehen... Im ersten Beitrag also. Wird gemacht :)

    Grüße autoiter