Показать полную графическую версию : [решено] Досрочный выход из цикла
Привет.
Подскажите, а как я могу досрочно выйти из цикла?
Т.е., выход из скрипта ( или завершение работы цикла) на любой итерации цикла, по нажатию кнопки "Stop".
$hgui = GUICreate("111", 500, 300, -1, -1)
Local $s1 = GUICtrlCreateButton('Start', 100, 10, 50, 22, 0x0)
Local $s2 = GUICtrlCreateButton('Stop', 100, 50, 50, 22, 0x0)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $s1
For $i = 1 To 5
MsgBox(0, '222', '333', 1)
Sleep(3000)
Next
Case $s2
Exit
EndSwitch
Wend
ExitLoop (https://www.autoitscript.com/autoit3/docs/keywords/ExitLoop.htm)
Mike909, пока цикл не дойдёт до конца, у меня не получается, ни Exit ни ExitLoop.
Как-же получится, если внутри цикла
For $i = 1 To 5
MsgBox(0, '222', '333', 1)
Sleep(3000)
Next
сообщения от кнопок никак не обрабатываются?
For нужно делать тогда уж снаружи Switch.
Нужен таймер:
$hgui = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("111", 500, 300, -1, -1)
$s1 = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)('Start', 100, 10, 50, 22, 0x0)
$s2 = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)('Stop', 100, 50, 50, 22, 0x0)
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)()
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) -3, $s2
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $s1
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 5
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, '222', '333', 1)
$iTimer = TimerInit (http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm)()
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) TimerDiff (http://www.autoitscript.com/autoit3/docs/functions/TimerDiff.htm)($iTimer) < 3000
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) -3, $s2
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Creat0R, а как можно сделать более универсальное решение?
Дело в том, что там не MsgBox, а абсолютно разные и непредсказуемые команды.
Много долгих Sleep.
Как можно сделать такую кнопку, при нажатии на корторую, будет немедленно выход из цикла, или из скрипта?
Много долгих Sleep. »
Которые нужно заменить на циклы, либо создать функцию чтобы не повторять:
#include <GUIConstantsEx.au3>
Global $hGUI, $iStart_Bttn, $iStop_Bttn
Global $iStop_Flag = False
$hGUI = GUICreate("111", 500, 300)
$iStart_Bttn = GUICtrlCreateButton('Start', 100, 10, 50, 22, 0x0)
$iStop_Bttn = GUICtrlCreateButton('Stop', 100, 50, 50, 22, 0x0)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $iStart_Bttn
_Start()
Case $iStop_Bttn
_Stop()
EndSwitch
WEnd
Func _Start()
GUICtrlSetState($iStart_Bttn, $GUI_DISABLE)
GUICtrlSetState($iStop_Bttn, $GUI_ENABLE)
For $i = 1 To 5
MsgBox(0, '222', '333', 1)
_Sleep(3000)
;MsgBox(0, '444', '555', 1)
;_Sleep(5000)
;MsgBox(0, '666', '777', 1)
;_Sleep(8000)
;SHOULD BE AT THE END
If $iStop_Flag Then
ExitLoop
EndIf
Next
_Stop()
EndFunc
Func _Stop()
$iStop_Flag = False
GUICtrlSetState($iStart_Bttn, $GUI_ENABLE)
GUICtrlSetState($iStop_Bttn, $GUI_DISABLE)
EndFunc
Func _Sleep($iTime)
If $iStop_Flag Then
Return
EndIf
Local $iTimer = TimerInit()
While TimerDiff($iTimer) < $iTime
Switch GUIGetMsg()
Case $iStop_Bttn
$iStop_Flag = True
ExitLoop
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
EndFunc
В любом случае Sleep будет останавливать выполнение скрипта.
Тут нужно либо повесить всё выполнение кнопки на внешний скрипт, либо постоянно проверять событие нажатия кнопки выхода/завершения, как я это сделал выше в примерах.
Вот получился рабочий код, с добавлением таймера и своей обработки событий :
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
$hgui = GUICreate("111", 500, 300, -1, -1)
Local $s1 = GUICtrlCreateButton('Start', 100, 10, 50, 22, 0x0)
GUICtrlSetOnEvent(-1, 'Start')
Local $s2 = GUICtrlCreateButton('Stop', 100, 50, 50, 22, 0x0)
GUICtrlSetOnEvent(-1, 'Stop')
GUISetOnEvent($GUI_EVENT_CLOSE, 'Stop')
GUISetState()
While 1
Sleep(10)
WEnd
;
Func Stop()
Exit
EndFunc
;
Func Start()
GUICtrlSetState($s1,$GUI_DISABLE)
AdlibRegister("Timer1", 10)
EndFunc
Func Timer1()
For $i = 1 To 5
MsgBox(0, '222', '333', 1)
Sleep(3000)
Next
GUICtrlSetState($s1,$GUI_ENABLE)
AdlibUnRegister("Timer1")
EndFunc
Creat0R, Mike909, спасибо.
Mike909,
Когда в вашем примере произойдёт событие Timer1(), и начнётся цикл For, скрипт остановит своё выполнение пока не закончится Sleep(3000).
Exit сработает, но не оставновка цикла в событий.
Creat0R,
Цель, вроде бы, выйти из скрипта. Если бы были вопросы по выходу из цикла, я бы посоветовал сделать булевый маркер и его менять и проверять.
Но раз вопросов не последовало, значит идеи достаточно, и Атос либо сам сделал как ему надо, либо так и надо было.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.