Что нового

Как остановить скрипт по кнопке

kvitnitskiy

Новичок
Сообщения
56
Репутация
0
Доброго времени суток уважаемые форумчане.
ПРошу сильно не пинать, уверен тема поднималась, перепробовал пару/тройку найденных вариантов - не работает :(.
Вопрос в следующем, как по кнопке остановить выполнение скрипта(не закрывая GUI) если скрипт зацыклен, и при необходимости его потом снова запустить опять по кнопке..
Есть некий скрипт, который после нажатия на кнопку обновить - каждые № секунд выполняет определенное действие и так до бесконечности. Хотелось бы иметь вожможность останавливать его. пока только через иконку в трее есть возможность.
Код:
#Region    ************ Includes ************
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <Date.au3>
#EndRegion ************ Includes ************

HotKeySet("{F1}", "Pause")
Global $Paused
Func Terminate()
	Exit 0
EndFunc ;==>Terminate

Func Pause()
	$Paused = Not $Paused
	While $Paused
		Sleep(10)
		ToolTip("F1")
	WEnd
	ToolTip("")
EndFunc ;==>Pause
$DesktopWidth  = @DesktopWidth
$DesktopHeight = @DesktopHeight

$Form1   = GUICreate("ShipBoard Refresher", 200, 80, $DesktopWidth -209, $DesktopHeight - $DesktopHeight, BitOR($GUI_Ss_Default_Gui, $DS_ModalFrame), BitOR($WS_Ex_Topmost, $WS_Ex_WindowEdge))
$TimeNow = GUICtrlCreateLabel(_Now(), 4, 1, 200, 28)
GUICtrlSetFont($TimeNow, 16)
$Label1       = GUICtrlCreateLabel("Обновление через", 4, 30, 158, 17)
$CounterLabel = GUICtrlCreateLabel("120", 120, 25, 61, 47)
GUICtrlSetFont($CounterLabel, 10)
$RefreshButton = GUICtrlCreateButton("Обновить!", 4, 48, 83, 29)
$StopButton = GUICtrlCreateButton("Остановить!", 90, 48, 83, 29)
GUISetState(@SW_SHOW)



Func Refresh()
	For $Counter = 120 To 0 Step -1
		GUICtrlSetData($TimeNow, _Now())
		GUICtrlSetFont($TimeNow, 16)
		GUICtrlSetData($CounterLabel, $Counter)
		GUICtrlSetFont($CounterLabel, 24)
		Sleep(1000)
	Next
	ControlClick("ABC Solutions", "", "[NAME:_MCSToolBar_Toolbars_Dock_Area_Top]", "left", 1, 95, 15)
	Refresh()
	sleep(2000)
EndFunc

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_Event_Close
			Exit
		Case $RefreshButton
			Refresh()
	EndSwitch
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
kvitnitskiy
как я понял, у тебя одна функция это Refresh()
Зачем в ней рекурсия? достаточно заключить в While...Wend
Код:
Func Refresh()
While 1
    For $Counter = 120 To 0 Step -1
        GUICtrlSetData($TimeNow, _Now())
        GUICtrlSetFont($TimeNow, 16)
        GUICtrlSetData($CounterLabel, $Counter)
        GUICtrlSetFont($CounterLabel, 24)
        Sleep(1000)
    Next
    ControlClick("ABC Solutions", "", "[NAME:_MCSToolBar_Toolbars_Dock_Area_Top]", "left", 1, 95, 15)
    sleep(2000)
WEnd
EndFunc

насчет "неподходящих" вариантов, то все нужно дотачивать под свои нужды
мой, примерный вариант
Код:
HotKeySet('!3', '_pause');Alt+3
HotKeySet('{ESC}', '_exit')
Local $Form1 = GUICreate("Form1", 260, 78, 192, 124)
Global $Label1 = GUICtrlCreateLabel("Label1", 24, 24, 188, 17)
GUISetState()
Global $p = 0
_func()
While 1
	Sleep(100)
WEnd

Func _exit()
	Exit
EndFunc   ;==>_exit

Func _pause()
	If $p Then
		$p = 0
	Else
		$p = 1
		While 1
			Sleep(50)
			If Not $p Then ExitLoop
		WEnd
	EndIf
EndFunc   ;==>_pause

Func _func()
	Local $i = 1
	While 1
		GUICtrlSetData($Label1, $i)
		$i += 1
		Sleep(100)
	WEnd
EndFunc   ;==>_func
 
Автор
K

kvitnitskiy

Новичок
Сообщения
56
Репутация
0
К сожалению не оно. Прерывание скрипта с выходом по хоткею - это у меня есть, а мне бы именно остановку скрипла без закрывания GUI
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
что значит не оно?
а это нажимал?
Код:
HotKeySet('!3', '_pause');Alt+3

это как раз пауза. один раз нажал - пауза. второй раз нажал - скрипт продолжил работу
 
Автор
K

kvitnitskiy

Новичок
Сообщения
56
Репутация
0
И пауза у меня есть в скрипте, если глянуть в него )
но меня интересует не пауза, а именно прерывание выполнение скрипта, по кнопке...
 

axsmak

Знающий
Сообщения
32
Репутация
7
Код:
Global $fStop = False

HotKeySet('!4', '_Stop')

Func _Stop()
  $fStop = True
EndFunc

Func Refresh()
While 1
    If $fStop Then Return ; Выход по Alt+4
    For $Counter = 120 To 0 Step -1
        GUICtrlSetData($TimeNow, _Now())
        GUICtrlSetFont($TimeNow, 16)
        GUICtrlSetData($CounterLabel, $Counter)
        GUICtrlSetFont($CounterLabel, 24)
        If $fStop Then Return ; Выход по Alt+4
        Sleep(1000)
    Next
    ControlClick("ABC Solutions", "", "[NAME:_MCSToolBar_Toolbars_Dock_Area_Top]", "left", 1, 95, 15)
    If $fStop Then Return ; Выход по Alt+4
    sleep(2000)
WEnd
EndFunc

Refresh()
$fStop = False
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
kvitnitskiy
В функции Refresh() вместо Sleep(1000) сделайте так
Код:
$Time = TimerInit()
        Do
          If GUIGetMsg() = $StopButton Then Return
        Until TimerDiff($Time) > 1000
И уменьшите высоту $CounterLabel, т.к. она накрывает кнопку $StopButton.
 
Автор
K

kvitnitskiy

Новичок
Сообщения
56
Репутация
0
InnI Спасибо большое, самое то что надо!!!
 
Верх