Что нового

Как сделать более адекватную проверку условий для остановки скрипта?

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			SaveSettings()
			Exit
		Case $StartAutoBuff
			$STOP = False
			HotKeySet("{F10}", "_Stop")
			GUICtrlSetData ($StartAutoBuff, "СТОП")
			ReadInfo()
			AutoBuff()
			GUICtrlSetData ($StartAutoBuff, "СТАРТ")
			HotKeySet("{F10}")
			WinActivate($BOTWindowName)
	EndSwitch
WEnd


Код:
Func _Stop()
	$STOP = True
EndFunc


Ну и соответственно на данный момент у меня проверка условий такая:

Код:
While Not $STOP


Хотелось бы, чтобы скрипт так же останавливал свою работу, если нажать на кнопку СТОП (она же СТАРТ, она же $StartAutoBuff), либо крестик.
Условие типа

Код:
While Not $STOP And $nMsg <> $GUI_EVENT_CLOSE And $nMsg <> $StartAutoBuff


Даже мне кажется немного извращенным...)

Функция

Код:
Func _Stop()
	If $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $StartAutoBuff Then Return True
	Return False
EndFunc


С условием

Код:
While Not _Stop()

Что-то вообще не катит... Даже если в условие Case $StartAutoBuff добавить $nMsg = 0 перед вызовом основной функции... Ноль реакции. Если $nMsg = 0 не добавлять, то скрипт даже не запускается...((
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Global $bStop = False
HotKeySet("{F10}", "_Stop")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			SaveSettings()
			Exit
        Case $StartAutoBuff
			$bStop = Not $bStop
			If $bStop Then 
			           GUICtrlSetData ($StartAutoBuff, "Старт")
				ReadInfo()
				AutoBuff()
			Else
				 GUICtrlSetData ($StartAutoBuff, "Стоп")
			EndIf
	EndSwitch
WEnd

Func _Stop()
	If $bStop Then Exit
EndFunc


Как нибудь так. Единственное, проверте условия начала и окончания, что бы все надписи соответствовали. Может быть понадобится переместить ReadInfo() и AutoBuff() в секцию else
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Ну, во-первых, GUICtrlSetData со стартом и со стопом надо местами поменять, а во-вторых, чем мне поможет смена надписи на кнопке в моем вопросе?
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Gui надо переписывать под GUIOnEventMode, потому что в этом месте
Код:
While Not $STOP

кнопкой цикл не остановить.
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Переписал, а что дальше?
Я даже специально отдельную кнопочку создал:

Код:
$Button1 = GUICtrlCreateButton("Button1", 333, 189, 97, 65)
GUICtrlSetOnEvent($Button1, "_Stop")

Func _Stop()
	$STOP = True
EndFunc


И все равно, пока функция AutoBuff() не завершит работу, реакции от нажатия кнопки Button1 нет...


Добавлено:
Сообщение автоматически объединено:

О как! Я даже опытным путем выяснил, что, пока не закончит работу функция, вызванная одной из кнопок в gui, все остальные элементы gui игнорируются и выполняются только при возвращении в цикл ожидания... :scratch:
Как так? Я как-то давным-давно пользовался прогой, написанной на autoit и там, блин, работа ее останавливалась при повторном нажатии на кнопку START (которая после первого применения меняла свое название на STOP). А у меня так не получается......(
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
SurikenTSD
http://autoit-script.ru/index.php/topic,357.0.html
http://autoit-script.ru/index.php/topic,5724.msg40881.html#msg40881
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Ни что не помогло. Первое - вообще одно только название, у меня функция не как в этом "примере" (выполняется 1 секунду, проходит проверку и снова запускается по циклу), она у меня длинная и выполнение ее в зависимости от ситуации может длится от нескольких минут. Пока функция выполняется подобным образом при нажатии на любую другую кнопку gui реакции не последует, пока функция не завершится или я ее через хоткей не завершу.

По второй ссылке вообще решительно не понял.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
SurikenTSD [?]
По второй ссылке вообще решительно не понял.
вот по второй ссылке скорее всего самое то. нужно разбираться. читать справку.
если можно, приведи весь код.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Примерный набросок, правда срабатывает не мгновенно, а с задержкой:
Код:
#include <GUIConstants.au3>

Global $hGUI, $hButton, $sMessage = 'null', $fInterrupt = False
$hGUI = GUICreate('test')
$hButton = GUICtrlCreateButton('Start', 10, 20, 100, 30)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			ConsoleWrite('Закрытие приложения' & @CRLF)
			Exit
		Case $msg = $hButton
			$fInterrupt = False
			GUICtrlSetData($hButton, 'Stop')
			AdlibRegister('_InterruptCheck')
			ConsoleWrite('Старт функции' & @CRLF)
			$sOut = _process()
			ConsoleWrite('Остановка функции ['  & $sOut & ']' & @CRLF)
			AdlibUnRegister('_InterruptCheck')
			GUICtrlSetData($hButton, 'Start')
	EndSelect
WEnd

Func _process()
	While 1
		If $fInterrupt Then Return($sMessage)
		Sleep(100)
	WEnd
EndFunc

Func _InterruptCheck()
	$hMsg = GUIGetMsg()
	Select
		Case $hMsg = $GUI_EVENT_CLOSE
			$sMessage = 'Была нажата кнопка закрытия приложения'
			$fInterrupt = True
		Case $hMsg = $hButton
			$sMessage = 'Была нажата кнопка Stop'
			$fInterrupt = True
	EndSelect
EndFunc

Соответсвенно, нужно добавить нормальный выход из функции _autobuff, если она не бесконечна, т.е.
Код:
Return('Баффинг завершен нормально')
и добавить проверку
Код:
If $fInterrupt Then Return($sMessage)
в циклы внутри autobuff.
 
Верх