Mehrere 'Case' möglichkeiten GLEICHZEITIG

  • Moiin leute...

    bin neu hier und beschäftige mich seit einer kurzen Weile mit AutoIt.. muss sagen, "TOP !! n1 !!"

    So, also zu meinem Problem...

    ich habe eine GUI mit mehreren Buttons, sobald man zB auf den Start button klickt, macht der sein ding und die GUI ist noch da, so weit so gut.
    Jedoch will ich das beim arbeiten des Scriptes (was alles jezt unter dem Button "Start" alles so aufgelistet ist), die MÖGLICHKEIT besteht das man den Button "STOP" nutzten kann ohne wartten zu müssen bis die Aufgabe bei "Start" schon durch ist.

    Beispiel:

    [autoit]


    While 1
    $msg = GUIGetMsg()
    Select
    case $msg = $btnStart
    MsgBox (64, "Test", "Test 01")
    sleep(10000)
    MsgBox (64, "Test", "Test 02")
    ExitLoop

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

    case $msg = $btnStop
    Exit
    ; Nur beispiel
    ExitLoop

    EndSelect
    WEnd

    [/autoit]

    So in diesem Beispiel ist es ja so das nach dem Betätigen vom Start-Button eine MsgBox kommt und nach 10sekunden die nächste MsgBox, aber ich will zwischen diesen 10sek die MÖGLICHKEIT haben zu beenden (beispiel)


    Ich hoffe mir kann jemand helfen ^^ und freue mich sehr auf eure hilfe !!!

    Danke im vorraus :D

    Mfg
    b0tn3t

  • Das funktioniert mit Autoit nur über Umwege oder gar nicht - ist eben eine Skriptsprache bei der Zeile für Zeile ausgeführt wird.
    Per AdlibRegister lässt sich beispielsweise eine timergesteuerte Funktion aufrufen.

  • Schau dir mal den OnEvent-Mode an.


    Ansonsten geht es auch (recht umständlich) so:

    Spoiler anzeigen
    [autoit]

    $hGUI = GUICreate("",85,100)
    $idButton1 = GUICtrlCreateButton("Button 1",20,20)
    $idButton2 = GUICtrlCreateButton("Button 2",20,50)
    GUISetState()

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

    While 1
    _MainLoop()
    Sleep(10)
    WEnd

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

    Func _MainLoop()
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $idButton1
    MsgBox(0,"","jetzt machen wir mal 10 sekunden pause ;)",3)
    _Sleep(10000)
    MsgBox(0,"","und schluss mit der pause",3)

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

    Case $idButton2
    MsgBox(0,"","Hallo, ich bin Button 2",1)
    EndSwitch
    EndFunc

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

    Func _Sleep($iTime)
    If StringRegExp($iTime,"\D") Then Return SetError(1,0,0) ; Falls $iTime eine Nicht-Ziffer enthält, dann breche ab.
    $t = TimerInit() ; Timer initialisieren
    Do
    _MainLoop() ; Hauptschleife ausführen, bis
    Until TimerDiff($t) > $iTime ; Zeit abgelaufen.
    EndFunc

    [/autoit]
  • Hallo BOTNET,

    hier einmal dein Beispiel im OnEvent-Modus:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    ;#include <WindowsConstants.au3>

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

    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1)

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

    Global $hGUI = GUICreate("My Test-Gui with OnEvent", 300, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    Global $btnStart = GUICtrlCreateButton("&Start", 90, 20, 120, 30)
    GUICtrlSetOnEvent(-1, "_Start")
    Global $btnExit = GUICtrlCreateButton("be&enden", 90, 50, 120, 30)
    GUICtrlSetOnEvent(-1, "_Exit")
    GUISetState()

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

    While 1 ;just idle, do nothin
    Sleep(1000)
    WEnd

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

    Func _Start()
    MsgBox(64, "Test", "Test 01")
    Sleep(10000)
    MsgBox(64, "Test", "Test 02")
    EndFunc ;==>_Start

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    aber auch gilt

    Zitat

    >> von Nuts in Post 2<< Das funktioniert mit Autoit nur über Umwege oder gar nicht - ist eben eine Skriptsprache bei der Zeile für Zeile ausgeführt wird.
    Per AdlibRegister lässt sich beispielsweise eine timergesteuerte Funktion aufrufen.

    Du solltest dein Vorhaben etwas genauer erläutern, vielleicht findet sich ja eine Lösung

    SEuBo: befürchte dass deine Lösung irgendwann die Resourcen sprengt bzw. das Skript abstürzt (zu viele Rekursionen, wenn es ausgiebig benutzt wird

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (22. Januar 2010 um 20:38)

  • Vielen dank für eure vorschläge!!

    ich weis nicht ob das jezt nur bei mir so der fall ist, aber wen ich bei diesen 2 Scripts auf den ersten button "start" klick, kann ich den 2ten jedoch nicht in diesem moment auch noch nutzten, also wären die MsgBox darsteht...

    vieleicht ist es wegen dem Exit befehl, vll funkt es wen man den Dienst direkt ausknipsen will zum beispiel

  • Das ist alles eine Frage des Ablaufs. Gibt einige Lösungen die zu einem Ziel führen, z.B. so....

    Spoiler anzeigen
    [autoit]

    Global $gestartet = False
    Global $start

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

    While 1
    $msg = GUIGetMsg()
    Select
    case $msg = $btnStart
    MsgBox (64, "Test", "Test 01")
    $gestartet = True
    $start = TimerInit()

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

    case $msg = $btnStop
    Exit
    ; Nur beispiel

    EndSelect

    If $gestartet = True And TimerDiff($start) > 10000 Then MsgBox (64, "Test", "Test 02")

    WEnd

    [/autoit]

    Der Trick an der Sache ist halt, das Du das Script weiter durch die WHILE-WEND-Schleifen laufen lassen musst, in der die GUIGetMsg()-Abfrage steht. Damit der Klick auf Exit erkannt wird.

    Bei Sleep() steht das Script anfach an der Stelle und macht erst weiter, wenn die Zeit um ist. Außer vielleich durch AdLibEnable()/AdLibRegister() unterbrochen.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Das liegt daran, dass MsgBoxen das Skript pausieren. Ich hatte mal eine _MsgBox() UDF erstellt, mit der es möglich ist, das zu umgehen. Leider wurde sie nie ganz fertig ( ich bin an der Flag-Abfrage gescheitert)

    Ich glaube die MsgBox'n beendet er schon, in der 10s Pause. Oder ?

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo b0tnet,

    Vielen dank für eure vorschläge!!

    ich weis nicht ob das jezt nur bei mir so der fall ist, aber wen ich bei diesen 2 Scripts auf den ersten button "start" klick, kann ich den 2ten jedoch nicht in diesem moment auch noch nutzten, also wären die MsgBox darsteht...

    vieleicht ist es wegen dem Exit befehl, vll funkt es wen man den Dienst direkt ausknipsen will zum beispiel

    den 2. kannst du anklicken, die func _exit wird jedoch erst nach Ablauf des Sleeps ausgelöst.

    aber du hast ja jetzt eine grundsätzliche Möglichkeit mit dem Skript von Micha_He. ich würde es allerdings wie folgt abändern, sonst erscheint die 2. MsgBox laufend bis zum beenden des Skriptes:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Global $gestartet = False
    Global $start

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

    Global $hGUI = GUICreate("My Test-Gui with OnEvent", 300, 200,10,10)

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

    Global $btnStart = GUICtrlCreateButton("&Start", 90, 20, 120, 30)
    Global $btnStop = GUICtrlCreateButton("be&enden", 90, 50, 120, 30)
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Select
    case $msg = $btnStart
    GUICtrlSetState($btnStart,$gui_disable)
    MsgBox (64, "Test", "Test 01")
    $gestartet = True
    $start = TimerInit()

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

    case $msg = $btnStop
    Exit
    ; Nur beispiel

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

    EndSelect

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

    If $gestartet And TimerDiff($start) > 10000 Then
    MsgBox (64, "Test", "Test 02")
    GUICtrlSetState($btnStart,$gui_enable)
    $gestartet = False
    EndIf

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

    WEnd

    [/autoit]


    mfg (Auto)Bert

  • Ich weiß es nicht. habe mich da auf dieses Zitat bezogen



    Zitat


    kann ich den 2ten jedoch nicht in diesem moment auch noch nutzten, also wären die MsgBox darsteht...

    Gut diese Äußerung war mir, beim Schreiben meiner Antwort, durchgerutscht. Da hast Du natürlich recht...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hier mein Vorschlag:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form = GUICreate("Beispiel von UEZ", 316, 46)
    $Button1 = GUICtrlCreateButton("Start", 8, 8, 75, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Stop", 232, 8, 75, 25, $WS_GROUP)
    $Input = GUICtrlCreateInput("0", 96, 8, 121, 21, $ES_READONLY)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    GUICtrlSetState($Button2, $GUI_DISABLE)
    $z = 0

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

    While 1 * Sleep(20)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister("Start")
    Exit
    Case $Button1
    GUICtrlSetState($Button1, $GUI_DISABLE)
    GUICtrlSetState($Button2, $GUI_ENABLE)
    $start = True
    AdlibRegister("Start", 100)
    Case $Button2
    GUICtrlSetState($Button1, $GUI_ENABLE)
    Stop()
    GUICtrlSetState($Button2, $GUI_DISABLE)
    EndSwitch
    WEnd

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

    Func Start()
    $z += 1
    GUICtrlSetData($Input, $z)
    Return
    EndFunc

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

    Func Stop()
    AdlibUnRegister("Start")
    Return
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hätte auch noch einen:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $title = "Unbenannt - Editor"

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Script pausieren", 361, 176, 375, 221)
    $Button1 = GUICtrlCreateButton("Test", 80, 48, 217, 73, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ShellExecute("notepad.exe")
    WinWaitActive($title)

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

    While 1 *Sleep(50)
    ControlSend($title, "", "[CLASS:Edit; INSTANCE:1]", "a")
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Pause()
    EndSwitch
    WEnd

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

    Func Pause()
    GUICtrlSetData($Button1, "Script fortsetzen")
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1
    ExitLoop
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Sleep(50)
    WEnd
    GUICtrlSetData($Button1, "Script pausieren")
    EndFunc ;==>Pause

    [/autoit]

    Na gut, Raupi hatte geholfen, da es zu einem Projekt von mir gehört hatte.

    Das ControlSend ist zur Demonstration, dass es aufhört.

    MfG

  • WOOOOOW !! :D vielen dank an leute...

    mir wurde sehr geholfen :) eure lösungsvorschläge sind super, danke !