#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <Date.au3>
$hGUI = GUICreate('Starter', 736, 294, 1476, 138) ; окно программы
$hInTime_1 = GUICtrlCreateInput('HH.MM.SS', 24, 24, 121, 21) ; поле для ввода времени
$hOutTime_1 = GUICtrlCreateInput('', 168, 24, 129, 21, $ES_READONLY) ; поля для вывода времени старта скрипта
$hCombo_1 = GUICtrlCreateCombo('1', 312, 24, 145, 21) ; combobox для выбора числа повторений скрипта
GUICtrlSetData(-1, '2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30', '1') ; варианты повторов
$hCheck_1 = GUICtrlCreateCheckbox('AutoRepeat', 472, 24, 81, 25) ; checkbox для автоповтора скрипта
$hStart_1 = GUICtrlCreateButton('Start 1', 576, 16, 105, 25, $WS_GROUP) ; кнопка старта
Global $iRepeat_1 = 0, $Stop_1 = False ; переменные
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $hStart_1 ; нажата кнопка старт
$sTime_1 = GUICtrlRead($hInTime_1) ; считываем время
If StringRegExp($sTime_1, '^\d\d\.\d\d\.\d\d$') Then ; проверяем, что считанная строка соответствует формату: hh.mm.ss
$aTime_1 = StringSplit(GUICtrlRead($hInTime_1), '.') ; из этой строки получаем массив:
$iHour_1 = $aTime_1[1] ; часы
$iMin_1 = $aTime_1[2] ; минуты
$iSec_1 = $aTime_1[3] ; секунды
If GUICtrlRead($hCheck_1) = $GUI_CHECKED Then
$iRepeat_1 = 0 ; если поставлен флажок "автоповтор", то переменной повтора присваиваем значение 0
Else
$iRepeat_1 = GUICtrlRead($hCombo_1) ; иначе считываем количество повторов из combobox
EndIf
GUICtrlSetData($hStart_1, 'Stop 1') ; переименовываем кнопку Старт в Стоп
GUICtrlSetState($hInTime_1, $GUI_DISABLE) ; блокируем поля ввода
GUICtrlSetState($hCheck_1, $GUI_DISABLE)
GUICtrlSetState($hCombo_1, $GUI_DISABLE)
Opt('GUIOnEventMode', 1) ; включение режима OnEvent для возможности прерывания скрипта в любой момент
$Stop_1 = False ; переменной остановки скрипта присваиваем значение ложь
GUICtrlSetOnEvent($hStart_1, '_stop') ; назначаем на кнопку "Стоп" функцию _stop
_main_1($iRepeat_1, $iHour_1, $iMin_1, $iSec_1) ; запуск функции _main с параметрами: число повторов, часы, минуты, секунды
Opt('GUIOnEventMode', 0) ; по завершении _main отключаем режим OnEvent
GUICtrlSetData($hStart_1, 'Start 1') ; переименовываем кнопку как было
GUICtrlSetState($hInTime_1, $GUI_ENABLE) ; разблокируем поля
GUICtrlSetState($hCheck_1, $GUI_ENABLE)
GUICtrlSetState($hCombo_1, $GUI_ENABLE)
Else
MsgBox(0, 'Error', 'Error in time format!') ; если введенные данные не соответствуют формату "hh.mm.ss" выдаем окошко с ошибкой
EndIf
Case $hCheck_1 ; обработка нажатия на chekbox
If GUICtrlRead($hCheck_1) = $GUI_CHECKED Then
GUICtrlSetState($hCombo_1, $GUI_DISABLE) ; если нажата - блокируем combobox
Else
GUICtrlSetState($hCombo_1, $GUI_ENABLE) ; если галка убрана - разблокируем
EndIf
EndSwitch
WEnd
Func _main_1($iReapeatCounter, $iHour, $iMin, $iSec) ; функция _main
$iCounter = 0 ; счетчик для подсчета пройденных циклов (пока равен 0)
_TicksToTime(_TimeToTicks($iHour + @HOUR, $iMin + @MIN, $iSec + @SEC), $iHour, $iMin, $iSec)
; функции для работы со временем : первая складывает текущее время с заданным и переводит его в тики
; вторая переводит тики обратно в три переменных
GUICtrlSetData($hOutTime_1, $iHour & ':' & $iMin & ':' & $iSec) ; выставляем в поле вывода времени запуска получившееся время старта скрипта
ConsoleWrite('-TIME WAITING-' & @CRLF) ; выдача в консоль
Do ; цикл ожидания времени начала
If $Stop_1 Then Return ; проверка не нажата ли кнопка "Стоп", если нажата - выходим
Sleep(1000); ждем секунду
Until $iHour - @HOUR <= 0 And $iMin - @MIN <= 0 And $iSec - @SEC <= 0 ; сравнение текущего времени со временем старта, если время пришло - идем дальше
ConsoleWrite('!START!' & @CRLF) ; выдача в консоль
Do ; основной цикл
;
;Здесь идет сам скрипт
ConsoleWrite('working...' & $iCounter & @CRLF)
Sleep(500)
;
$iCounter += 1 ; приращение для счетчика количества повторов
Until $iReapeatCounter = $iCounter Or $Stop_1 = True ; будет выполняться пока счетчик не совпадет с заданным количеством повторов или не будет нажата кнопка "Стоп"
; если выбран режим автоповтора, то данный цикл может завершиться только по нажатию кнопки "Стоп"
ConsoleWrite('+FINISH+' & @CRLF); выдача в консоль
GUICtrlSetData($hOutTime_1, '') ; очищаем поле времени старта скрипта
EndFunc
Func _stop() ; функция остановки по кнопке
If @GUI_CtrlId = $hStart_1 Then
$Stop_1 = True
EndIf
EndFunc