Wie beendet man eine "Unter"-Schleife per Knopfdruck?
Im Demo läuft die Hauptschleife der GUI. Wenn man den Button "OK" klickt, wird die TestFunc1() gestartet, in der dann für 10 Sekunden die Unter-Schleife läuft. Wie kann man die Unter-Schleife vorzeitig beenden?
Ich habe es mit einer globalen Variablen "$g_bCancel" versucht, die beim Klick auf den Close-Button (das "rote" X) auf True gesetzt wird. In der Unter-Schleife wird $g_bCancel abgefragt und bei True sollte die Unter-Schleife beendet werden. Ich habe für die GUI den MessageLoop Modus und den OnEvent Modus probiert, leider kommt das "True" in der Unter-Schleife nicht an (in der Hauptschleife der GUI kommt es an).
Als Demo habe ich ein Beispiel aus der AutoIt Hilfe als Basis genommen und angepasst.
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
Local $hMainGUI = GUICreate("Hallo Welt", 300, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton")
GUICtrlCreateLabel("Klicke auf OK und dann auf den Close-Button." & @CRLF _
& "GUI wird NICHT geschlossen!", 30, 10, -1, 50)
Local $iOKButton = GUICtrlCreateButton("OK", 120, 70, 60)
GUICtrlSetOnEvent($iOKButton, "OKButton")
GUISetState(@SW_SHOW, $hMainGUI)
Global $g_bCancel = False
While 1
Sleep(100) ; Im Leerlauf bummeln
ConsoleWrite("$g_bCancel (MainLoop): " & $g_bCancel & @CRLF)
WEnd
Func OKButton()
; Beachte: an diesem Punkt wäre @GUI_CtrlId gleich $iOKButton,
; und @GUI_WinHandle wäre gleich $hMainGUI
; MsgBox($MB_OK, "GUI Event", "Du hast auf OK geklickt!")
TestFunc1()
EndFunc ;==>OKButton
Func CLOSEButton()
; Beachte: an diesem Punkt wäre @GUI_CtrlId gleich $GUI_EVENT_CLOSE,
; und @GUI_WinHandle wäre gleich $hMainGUI
; MsgBox($MB_OK, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
$g_bCancel = True
Exit
EndFunc ;==>CLOSEButton
Func TestFunc1()
Local $iCnt = 0
Do
Sleep(250)
ConsoleWrite("$g_bCancel: " & $g_bCancel & @CRLF)
If $g_bCancel Then Exit
GUICtrlSetData($iOKButton, $iCnt)
$iCnt += 1
Until $iCnt = 40 ; Läuft ca. 10 Sekunden.
EndFunc ;==>TestFunc1
Alles anzeigen