[решено] Повторение кода через промежуток времени

Аватара пользователя
sashadeg

[решено] Повторение кода через промежуток времени

Сообщение sashadeg »

Помогите пожалуйста...



Нужно вот что:

1. Запускаешь скрипт и ставишь время в которое он должен продолжить работу(например 22:05:00), вводишь промежуток времени (например 10 минут)

2. скрипт ждёт когда на часах будет 22 часа 5 минут и по достижению этого времени выполняет пару команд... Изображение

3. после выполнения "пары команд" ждёт заданные 10 минут и выполняет ещё "одну команду"...

4. Впадает в спячку и ровно через ОДИН ЧАС (23 часа 5 минут) снова выполняет "пару команд", ждёт 10 мин, выполняет ещё "одну команду" и так до бесконечности............



Вот примерно так...



Лично я сделал это, но мне надо сделать так чтобы переменную (которая отвечает за промежуток времени, тот который 10 минут) можно было менять... а у меня если её поменяешь то скрипт в следущий раз уже не будет ровно в 23 часа 5 минут повторять то что нужно...



Может я что то туповато обьяснил, ну если не понятно то спросите, я конкретней обьясню Изображение



Спасибо заранее, каждый ваш пост важен для меня!!!
Аватара пользователя
SyDr

Re: [решено] Повторение кода через промежуток времени

Сообщение SyDr »

До бесконечности? Или есть какое-то условие выхода?



Этот вариант работает, елси твои действия выполняются достаточно быстро. В противном случае делай корректировки или, если невозможно предугадать, сколько времени будут выполняться нужные действия - используй AddLib (это функция, посмотри в справке) в качестве таймера Изображение





Код:

Код: Выделить всё

FirstRunH = 23
$FirstRunM = 05
$TimeNext = 10 * 60 *1000
$TimeHourN = 60 * 60 * 1000 - $TimeNext
$FirstSleep = ($FirstRunH - @HOUR) * 60 * 60 *1000 + ($FirstRunM - @MIN) * 60 *1000
Sleep($FirstSleep)
While 1 Do
DoSom($param)
Sleep($TimeNext)
DoSom($param)
Sleep($TimeHourN)
WEnd
Func DoSom($Param)
...
EndFunc
Аватара пользователя
beve

Re: [решено] Повторение кода через промежуток времени

Сообщение beve »

Вот, только в качестве наводки на путь размышления этот пример. Он не полностью рабочий, ибо нужно еще реализовать форматирование время при сложении (например если сложить @HOUR+1, а @HOUR будет равно 23 часам, то выйдет 24, а нам нужно ведь 00!, если @HOUR будет 01 и мы прибавим @HOUR+1, то выйдет 2, а нужно 02!, тоже и с минутами...) Но может это и сам сможеш сделать...с помощью функции StringFormat и еще чего-то...

Код:

Код: Выделить всё

#include 
Global $nowtime
Global $komanda1=(@HOUR&":"&@MIN-1) ;в переменной будет хранится следующий запуск "первых двух программ"
Global $komanda2=(@HOUR&":"&@MIN-1)
Global $Intervalkomanda2="10"; в переменной будет хранится интервал, по истечении которого запустится вторая прога.
$Gui=GUICreate("Form", 343, 94, 307, 195)
GUICtrlCreateLabel(" Текущее время:", 8, 0, 90, 17)
$Time_Label=GUICtrlCreateLabel("00:00:00", 104, 0, 50, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlCreateLabel(" Следующий запуск (формат записи 00:00):", 0, 16, 224, 17)
$timeDate = GUICtrlCreateLabel("00:00", 232, 16, 46, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$InputVremya_nachala = GUICtrlCreateInput($komanda1, 280, 8, 57, 21)
GUICtrlCreateLabel(" Интервал после выполнения первых прог (от 1 до 59):", 0, 40, 282, 17)
$Inputinterval=GUICtrlCreateInput("10", 280, 32, 57, 21)
$Ok_but = GUICtrlCreateButton("Применить и свернуть в панель задач", 0, 64, 337, 25, 0)
GUISetState(@SW_SHOW,$Gui) 
AdlibEnable("Set_System_Time", 1000)
While 1 
$nMsg = GUIGetMsg() 
Switch $nMsg 
Case $GUI_EVENT_CLOSE 
AdlibDisable()
Exit
Case $Ok_but
    $komanda1=GUICtrlRead($InputVremya_nachala ) ;записываем новое значение следующего запуска "первых двух прог"
    Guictrlsetdata($timeDate,$komanda1)
     $Intervalkomanda2=GUICtrlRead($Inputinterval ) ;записываем новое значение интервала
GUISetState(@SW_MINIMIZE,$Gui)
EndSwitch 
If $komanda1 == $nowtime Then
    $komanda1=@Hour+1&":"&@MIN
    Guictrlsetdata($timeDate,$komanda1)
    MsgBox(0,"1","Время для первых 2 команд") ;тут запуск "пары команд"
    $komanda2=@HOUR&":"&@MIN+$Intervalkomanda2
endif
if $komanda2==$nowtime Then
    MsgBox(0,"2","Пришлоо время для выполнения последней команды")  ;тут запус остальной команды
endif
WEnd
;
Func Set_System_Time()
$nowtime=@HOUR&":"&@MIN
Guictrlsetdata($Time_Label, $nowtime&":"&@SEC)
EndFunc
Аватара пользователя
sashadeg

Re: [решено] Повторение кода через промежуток времени

Сообщение sashadeg »

Цитата Sylver Dragon:



Этот вариант работает, елси твои действия выполняются достаточно быстро.
[решено] Повторение кода через промежуток времени




Вот ИМЕННО ЭТО у меня и не получается!!! На разных компах скорость выполнения команд РАЗНОЕ. Например у меня на одном компе, командой 'send', определённый текст вводиться так, что я не успеваю читать, а на другом этот текст по букве в секунду выдаёт!!! Следуя из этого и скрипт в следующий раз уже не через час запуститься я с погрешностью...




Цитата beve:



если сложить @HOUR+1, а @HOUR будет равно 23 часам, то выйдет 24, а нам нужно ведь 00!, если @HOUR будет 01 и мы прибавим @HOUR+1, то выйдет 2, а нужно 02



А если @HOUR сделать как переменную (например $chas) и к этой переменной добавлять +1 каждый час, а потом поставить условие: "ЕСЛИ $chas = 23, ТО $chas = -1", после этого как и положено добавиться 1 и будет 0 ( -1 + 1 = 0 )




Цитата beve:



если @HOUR будет 01 и мы прибавим @HOUR+1, то выйдет 2, а нужно 02



Если я не ошибаюсь, то нужно чтобы час был именно 0, а не 00 или 01, 02 ...
Аватара пользователя
beve

Re: [решено] Повторение кода через промежуток времени

Сообщение beve »

Цитата sashadeg:



Если я не ошибаюсь, то нужно чтобы час был именно 0, а не 00 или 01, 02 ...
[решено] Повторение кода через промежуток времени




Смотри, в переменной $nowtime будет всегда так, как в системном времени час и минуты, например 02:23, а не 2:23. $komanda1 будет содержать время следующего запуска, и можно было бы сюда добавлять просто 2:23, но тогда при сравнении с $nowtime будет не состыковка, ибо в системном времени всегда пишется 01,02,03, а не 1,2,3, и при сравнении будет: 2:23==02:23 и в результате - false. Поэтому я и написал, что нужно сделать, ибо чтоб в переменной системного времени, убирать ноль чтоб было при сравнении: 2:23==2:23, ибо в переменную $komanda1 добавлять 0, чтоб было при сравнении 02:23==02:23
Аватара пользователя
sashadeg

Re: [решено] Повторение кода через промежуток времени

Сообщение sashadeg »

А хорошо бы сделать, ещё GUI которое будет показывать, сколько раз программа повторилась, и дату первого запуска...

Я сам сделал через MsgBox но приходиться нажимать на кнопку, чтобы обновить результаты... а это не очень практично...



===============================================================================================



P.S.

а я вот что использовал для того чтобы программа ждала время для первого запуска



Код:

Код: Выделить всё

#include 
$sTime = InputBox("", "Введите время первого запуска")
_ScheduleStart_Proc($sTime)
Func _ScheduleStart_Proc($sStartTime)
    While 1
        If _NowTime() = $sStartTime Then Return 1
        Sleep(100)
    WEnd
EndFunc

вот тут если будешь использовать 00, 01 , 02,... а не 0,1,2,... то программа запустится но никогда не начнётся....
Аватара пользователя
beve

Re: [решено] Повторение кода через промежуток времени

Сообщение beve »

Цитата sashadeg:



А хорошо бы сделать, ещё GUI которое будет показывать, сколько раз программа повторилась, и дату первого запуска...
[решено] Повторение кода через промежуток времени




Вот, кажись должно полностью работать:

Код: Выделить всё

#include <GuiConstants.au3>
Global $nowtime
Global $Time_kom1=(@HOUR&":00") ;в переменной будет хранится следующий запуск "первых двух программ"
Global $Time_kom2=(@HOUR&":00")
Global $Intervalkomanda2="10"; в переменной будет хранится интервал, по истечении которого запустится вторая прога.
Global $Count="0"
$Gui=GUICreate("Планировщик", 343, 150, 307, 195)
GUICtrlCreateLabel(" Текущее время:", 8, 0, 90, 17)
$Time_Label=GUICtrlCreateLabel("00:00:00", 104, 0, 50, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlCreateLabel(" Следующий запуск (формат записи 00:00):", 0, 16, 224, 17)
$timeDate = GUICtrlCreateLabel("00:00", 232, 16, 46, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$InputVremya_nachala = GUICtrlCreateInput($Time_kom1, 280, 8, 57, 21)
GUICtrlCreateLabel(" Интервал после выполнения первых прог (от 1 до 59):", 0, 40, 282, 17)
$Inputinterval=GUICtrlCreateInput("10", 280, 32, 57, 21)
GUICtrlCreateLabel(" Счетчик, сколько раз уже был запуск:", 0, 65, 280, 17)
$CountLabel = GUICtrlCreateLabel("0", 232, 65, 46, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateLabel(" Дата запуска:", 0, 95, 280, 17)
GUICtrlCreateLabel(@MDAY&"\"&@MON&"\"&@YEAR, 232, 95, 76, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$Ok_but = GUICtrlCreateButton("Применить и свернуть в панель задач", 0, 120, 337, 25, 0)
GUISetState(@SW_SHOW,$Gui) 
AdlibEnable("Set_System_Time", 1000)
While 1 
$nMsg = GUIGetMsg() 
Switch $nMsg 
Case $GUI_EVENT_CLOSE 
    AdlibDisable()
    Exit
Case $Ok_but
    $Time_kom1=GUICtrlRead($InputVremya_nachala ) ;записываем новое значение следующего запуска "первых двух прог"
    Guictrlsetdata($timeDate,$Time_kom1) ;запись следующего запуска
    $Intervalkomanda2=GUICtrlRead($Inputinterval ) ;записываем новое значение интервала
    GUISetState(@SW_MINIMIZE,$Gui)
EndSwitch 
If $Time_kom1 == $nowtime Then
    Guictrlsetdata($CountLabel,$Count+1); пишем в счетчик запусков
    $Hour=@Hour+1
    Switch $Hour
        Case "24"
        $Hour="00"
        case 1 To 9
        $Hour="0"&$Hour
    endswitch
    $Time_kom1=$Hour&":"&@MIN
    Guictrlsetdata($timeDate,$Time_kom1) ;запись следующего запуска
    MsgBox(0,"1","Время для первых 2 команд") ;тут запуск "пары команд"
    $Min=@MIN+$Intervalkomanda2
    $Hour=@HOUR
    if $Min>60 then 
        $Min=$Min-60
        $Hour=@HOUR+1
    Switch $Hour
        Case "24"
        $Hour="00"
        case 1 To 9
        $Hour="0"&$Hour
    endswitch
    endif
    if $Min>0 and $Min<10 then $Min="0"&$Min
    $Time_kom2=$Hour&":"&$Min
    Guictrlsetdata($Inputinterval,$Time_kom2) ;только для того чтобы убедится что запуск "проги 2" будет в нужное время (а так ненужно)
endif
if $Time_kom2==$nowtime Then
    MsgBox(0,"2","Пришлоо время для выполнения последней команды")  ;тут запус остальной команды
    $Time_kom2="11111111" ;это нужно для того, чтобы если "прога2" будет выполнятся меньше 1 минуты, то небыло ее повторного запуска
endif
WEnd
;
Func Set_System_Time()
$nowtime=@HOUR&":"&@MIN
Guictrlsetdata($Time_Label, $nowtime&":"&@SEC)
EndFunc
Аватара пользователя
sashadeg

Re: [решено] Повторение кода через промежуток времени

Сообщение sashadeg »

Смотри, вот мой пример:



Код:

Код: Выделить всё

#include 
$sTime = InputBox("время запуска Часы:Минуты","")
$sek = InputBox("","Время выжидания для следующего повторения СЕКУНДЫ")
_ScheduleStart_Proc($sTime & ":00")
Func _ScheduleStart_Proc($sStartTime)
    While 1
        If _NowTime() = $sStartTime Then Return 1
        Sleep(100)
    WEnd
EndFunc
$i = 0
While 1
MsgBox(1,"Пример :)","Уже повторов:"& $i,3)
Sleep($sek*1000)
$i=$i+1
WEnd
;$i - это число выполненых раз

Мне нужно попроще... Возможно создать такое Gui к моему коду, которое будет показывать изменение переменной $i в режиме on-line (если можно так выразиться). ТО есть как часы у тебя... показывают каждое изменение секунды...



P.S.

Если честно, то я мало понимаю, что ты тут написал ^^
Аватара пользователя
sashadeg

Re: [решено] Повторение кода через промежуток времени

Сообщение sashadeg »

Цитата sashadeg:



Как внедрить сюды GUI
[решено] Повторение кода через промежуток времени




Просто создаеш gui-oкно, а в нем label. Потом вместо вызова MsgBox-а, просто отсылаеш новое значение $i в label. Но скрипт тебе нужно доработать еще, лучше сделать 1 цикл - While 1...Wend, а в нем уже все нужные действия прописать, а то при таком раскладе, очередь ко второму циклу не дойдет, а если сделаеш при соблюдении условия - выход из первого цикла (Exitloop), то начнется второй цикл, который будет выполнятся бесконечно, с вызовом месаджбокса (или запись в label) через указанное тобой число секунд... Или этот пример не имеет отношения к твоему посту, что программа должна выполнятся через час...постоянно, +еще один вызов через указанное время после выполнения 1.



Добавлено:

Я пытался сделать, как проще..., Лучше спроси по конкретной функции, которую не понимаэш...Если конечно, не про все... Можно упростить скрипт, поубирав лишние метки (labels)...
Аватара пользователя
beve

Re: [решено] Повторение кода через промежуток времени

Сообщение beve »

сДелал, всё как ты написал... Дурья моя бошка... Не робит нифига... помоги, пожалуйста с конкретным моим примером(сделать GuI окно статуса работы скрипта: сколько раз прошел цикл + время и дата первого запуска(буду Очень Сильно тебе благодарен)... просто я пользуюсь щас этим скриптом (правда с погрешностями небольшими идет время)
Ответить

Вернуться в «AutoIt»