GUIGetMsg Problem - Nicht auf Eingabe warten / Abbrechen Knopf

  • Servus,

    ich habe ein ähnliches Problem wie - HIER -, werde aber nicht ganz schlau aus den Lösungsansätzen.
    Ich habe folgendes Problem, ich habe eine normale GUI Schleife dieser Art:

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $cmdStart
    auswerten()
    EndSwitch
    WEnd

    [/autoit]

    Nun startet eine Funktion die etwas Rechenzeit in Anspruch nimmt. Diese würde ich gerne durch einen erneuten Druck auf diesen Button abbrechen lassen.

    [autoit]

    Func auswerten()
    GUICtrlSetData($cmdStart, "Abbrechen...")
    While 1
    If GUIGetMsg() = $cmdStart Then
    Msgbox(48, "Fehler", "Vorgang abgebrochen")
    Return
    EndIf
    ; Ganz viel machen...
    WEnd
    EndFunc

    [/autoit]

    Das Problem ist, dass GUIGetMsg() auf eine Benutzereingabe wartet und so die Schleife nicht abgearbeitet wird. Aus dem OnEvent -Mode werde ich nicht schlau, zumal nach der Option die GUI in der jetzigen Form gar nicht mehr reagiert. Hat jemand ne Idee wie ich das lösen kann?

    MMM

  • Der OnEvent Mode ist nicht wirklich schwer. Im Grunde fungieren dann alle Controls, für die mit GuiCtrlSetOnEvent ein Event bestimmt wurde, als Hotkeys.
    Und für Jedes gesetzte Event wird eine bestimmte Funktion aufgerufen.
    z.B:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 278, 74, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Button1 = GUICtrlCreateButton("Button1", 8, 8, 75, 57, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Button1Click")
    $Button2 = GUICtrlCreateButton("Button2", 96, 8, 83, 57, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Button2Click")
    $Button3 = GUICtrlCreateButton("Button3", 192, 8, 75, 57, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Button3Click")
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func Button1Click()
    MsgBox(64, "Info", "Du hast Button 1 gedrückt")
    EndFunc

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

    Func Button2Click()
    MsgBox(64, "Info", "Du hast Button 2 gedrückt")
    EndFunc

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

    Func Button3Click()
    MsgBox(64, "Info", "Du hast Button 3 gedrückt")
    EndFunc

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

    Func Form1Close()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Oder im Messageloop Modus:

    Spoiler anzeigen
    [autoit]

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

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

    $Form1 = GUICreate("Form1", 278, 74, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 8, 8, 75, 57, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Button2", 96, 8, 83, 57, $WS_GROUP)
    $Button3 = GUICtrlCreateButton("Button3", 192, 8, 75, 57, $WS_GROUP)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1
    MsgBox(64, "Info", "Du hast Button 1 gedrückt")
    Case $Button2
    MsgBox(64, "Info", "Du hast Button 2 gedrückt")
    Case $Button3
    MsgBox(64, "Info", "Du hast Button 3 gedrückt")
    Case $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Edit: Du kannst auch ein Event für ein Control neu bestimmen, und so eine andere Funktion aufrufen die die erste abbricht.
    z.B. so:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 278, 74, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Button1 = GUICtrlCreateButton("Button1", 8, 8, 75, 57, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Button1Click")
    $Button2 = GUICtrlCreateButton("Button2", 96, 8, 83, 57, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Button2Click")
    $Button3 = GUICtrlCreateButton("Button3", 192, 8, 75, 57, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Button3Click")
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func Button1Click()
    MsgBox(64, "Info", "Du hast Button 1 gedrückt")
    GUICtrlSetData($Button1, "Beenden")
    GUICtrlSetOnEvent($Button1, "Form1Close")
    EndFunc

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

    Func Button2Click()
    MsgBox(64, "Info", "Du hast Button 2 gedrückt")
    GUICtrlSetData($Button2, "Beenden")
    GUICtrlSetOnEvent($Button2, "Form1Close")
    EndFunc

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

    Func Button3Click()
    MsgBox(64, "Info", "Du hast Button 3 gedrückt")
    GUICtrlSetData($Button3, "Beenden")
    GUICtrlSetOnEvent($Button3, "Form1Close")
    EndFunc

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

    Func Form1Close()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]
  • Hallo MMM,

    wenn du dir den anderen Thread genau gelesen hättest, wüsstest du dass ohne komplettes Skript eine echte Hilfe nicht möglich ist. Das einzige was sich seitdem entscheidend geändert hat, du kannst jetzt mehrere Adlib's verwenden siehe dazu die Hilfe von AdlibRegister und AdlibUnregister. IsPressed könnte auch noch nützlich sein.
    Egal ob du im GuiGetMsg- oder OnEventModus skriptest, während die func läuft werden die Ereignisse zwar ausgelöst, aber erst nach Beendigung der func abgearbeitet.

    mfg (Auto)Bert

  • Also mir hilft der EventMode erstmal nicht weiter, trotzdem danke name22, ist mir jetzt auch klar geworden wie man das benutzt. (Koda hat da sogar ne Automatisierte Funktion für ^^)

    wenn du dir den anderen Thread genau gelesen hättest, wüsstest du dass ohne komplettes Skript eine echte Hilfe nicht möglich ist.

    Schön, dass du mir unterstellst ich hätte ihn nicht richtig gelesen :thumbup:
    Aber die restlichen 300 Zeilen hätten euch weder mehr Infos über das Problem gegeben, noch hättet ihr ihn ohne Datenbank ausführen können.


    Das einzige was sich seitdem entscheidend geändert hat, du kannst jetzt mehrere Adlib's verwenden siehe dazu die Hilfe von AdlibRegister und AdlibUnregister. IsPressed könnte auch noch nützlich sein.
    Egal ob du im GuiGetMsg- oder OnEventModus skriptest, während die func läuft werden die Ereignisse zwar ausgelöst, aber erst nach Beendigung der func abgearbeitet.

    Ok, also AdlibRegister scheint die einzige Möglichkeit 2 'Parallele' Funcs laufen zu lassen, es sei denn ein Prozess läuft im Hauptprozess, also in der Hauptschleife des Programmes?! ( So wie hier: [ gelöst ] wie beende ich einen gui während eines laufenden prozesses )

    Also ist vermutlich die Adlib Methode mit IsPressed und Button koordinaten die beste Lösung.

    Einmal editiert, zuletzt von MMM (19. Februar 2010 um 04:08)