Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Досрочный выход из цикла

Ответить
Настройки темы
[решено] Досрочный выход из цикла

Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет.

Подскажите, а как я могу досрочно выйти из цикла?

Т.е., выход из скрипта ( или завершение работы цикла) на любой итерации цикла, по нажатию кнопки "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

Отправлено: 10:43, 27-07-2017

 

Аватара для Mike909

Новый участник


Сообщения: 38
Благодарности: 14

Профиль | Отправить PM | Цитировать


ExitLoop

Отправлено: 10:58, 27-07-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


Mike909, пока цикл не дойдёт до конца, у меня не получается, ни Exit ни ExitLoop.

Отправлено: 11:30, 27-07-2017 | #3


Аватара для Mike909

Новый участник


Сообщения: 38
Благодарности: 14

Профиль | Отправить PM | Цитировать


Как-же получится, если внутри цикла
Код: Выделить весь код
			
For $i = 1 To 5
	MsgBox(0, '222', '333', 1)
	Sleep(3000)
Next
сообщения от кнопок никак не обрабатываются?

For нужно делать тогда уж снаружи Switch.

Отправлено: 18:14, 27-07-2017 | #4


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Нужен таймер:

Код: Выделить весь код
$hgui = GUICreate("111", 500, 300, -1, -1)

$s1 = GUICtrlCreateButton('Start', 100, 10, 50, 22, 0x0)
$s2 = GUICtrlCreateButton('Stop', 100, 50, 50, 22, 0x0)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3, $s2
            Exit
        Case $s1
            For $i = 1 To 5
                MsgBox(0, '222', '333', 1)

                $iTimer = TimerInit()

                While TimerDiff($iTimer) < 3000
                    Switch GUIGetMsg()
                        Case -3, $s2
                            Exit
                    EndSwitch
                WEnd
            Next
    EndSwitch
WEnd

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 18:26, 27-07-2017 | #5


Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


Creat0R, а как можно сделать более универсальное решение?
Дело в том, что там не MsgBox, а абсолютно разные и непредсказуемые команды.
Много долгих Sleep.
Как можно сделать такую кнопку, при нажатии на корторую, будет немедленно выход из цикла, или из скрипта?

Отправлено: 10:21, 28-07-2017 | #6


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата Атос:
Много долгих 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 будет останавливать выполнение скрипта.
Тут нужно либо повесить всё выполнение кнопки на внешний скрипт, либо постоянно проверять событие нажатия кнопки выхода/завершения, как я это сделал выше в примерах.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:35, 28-07-2017 | #7


Аватара для Mike909

Новый участник


Сообщения: 38
Благодарности: 14

Профиль | Отправить PM | Цитировать


Вот получился рабочий код, с добавлением таймера и своей обработки событий :

Код: Выделить весь код
#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

Последний раз редактировалось Mike909, 29-07-2017 в 12:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:57, 29-07-2017 | #8


Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


Creat0R, Mike909, спасибо.

Отправлено: 12:07, 29-07-2017 | #9


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Mike909,
Когда в вашем примере произойдёт событие Timer1(), и начнётся цикл For, скрипт остановит своё выполнение пока не закончится Sleep(3000).
Exit сработает, но не оставновка цикла в событий.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 20:07, 31-07-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Досрочный выход из цикла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Может ли материнка выйти из строя из-за... nikhop Материнские платы и память 1 17-09-2016 11:23
Интерфейс - экранная лупа Khch Microsoft Windows 7 3 14-10-2013 13:49
как выйти из запоя P.M. Флейм 182 10-02-2013 03:51
MSFT SQL Server - Помогите выйти из ' SUSPECT ' morozov_s_v Программирование и базы данных 3 11-03-2010 01:12
как выйти в Интернет из WMVare egik Сетевые технологии 3 07-01-2007 23:06




 
Переход