Войти

Показать полную графическую версию : [решено] Повторение кода через промежуток времени


sashadeg
03-05-2009, 20:36
Помогите пожалуйста...

Нужно вот что:
1. Запускаешь скрипт и ставишь время в которое он должен продолжить работу(например 22:05:00), вводишь промежуток времени (например 10 минут)
2. скрипт ждёт когда на часах будет 22 часа 5 минут и по достижению этого времени выполняет пару команд... :)
3. после выполнения "пары команд" ждёт заданные 10 минут и выполняет ещё "одну команду"...
4. Впадает в спячку и ровно через ОДИН ЧАС (23 часа 5 минут) снова выполняет "пару команд", ждёт 10 мин, выполняет ещё "одну команду" и так до бесконечности............

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

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

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

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

SyDr
03-05-2009, 22:48
До бесконечности? Или есть какое-то условие выхода?

Этот вариант работает, елси твои действия выполняются достаточно быстро. В противном случае делай корректировки или, если невозможно предугадать, сколько времени будут выполняться нужные действия - используй 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
04-05-2009, 01:35
Вот, только в качестве наводки на путь размышления этот пример. Он не полностью рабочий, ибо нужно еще реализовать форматирование время при сложении (например если сложить @HOUR+1, а @HOUR будет равно 23 часам, то выйдет 24, а нам нужно ведь 00!, если @HOUR будет 01 и мы прибавим @HOUR+1, то выйдет 2, а нужно 02!, тоже и с минутами...) Но может это и сам сможеш сделать...с помощью функции StringFormat и еще чего-то...#include <GuiConstants.au3>

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
04-05-2009, 14:41
Этот вариант работает, елси твои действия выполняются достаточно быстро. »

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

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

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

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

beve
04-05-2009, 15:12
Если я не ошибаюсь, то нужно чтобы час был именно 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
04-05-2009, 15:18
А хорошо бы сделать, ещё GUI которое будет показывать, сколько раз программа повторилась, и дату первого запуска...
Я сам сделал через MsgBox но приходиться нажимать на кнопку, чтобы обновить результаты... а это не очень практично...

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

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

#include <Date.au3>
$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
04-05-2009, 16:23
А хорошо бы сделать, ещё 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
04-05-2009, 19:31
Смотри, вот мой пример:

#include <Date.au3>
$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.
Если честно, то я мало понимаю, что ты тут написал ^^

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

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

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

beve
04-05-2009, 22:36
GuI окно статуса работы скрипта: сколько раз прошел цикл + время и дата »
Вот, твой код:#include <Date.au3>
HotKeySet("{Esc}", "_Exit");нужно чтобы прекратить работу скрипта, если нажать на клавишу Esc
HotKeySet("{PAUSE}", "_Hide");нужно чтобы скрыть из вида gui-окно, нажать на клавишу PAUSE (скрипт будет продолжать свою работу, и счетчик будет работать, чтобы окно появилось вновь нужно нажать на клавишу PAUSE)

$hGui=GUICreate("Count", 188, 90)
GUICtrlCreateLabel("Счетчик запусков: ", 8, 16, 100, 17)
$nCount = GUICtrlCreateLabel("0", 112, 16, 39, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif");только чтоб красивей
GUICtrlSetColor(-1, 0xFF0000);только чтоб красивей

GUICtrlCreateLabel("Время | Дата запуска: ", 8, 36, 170, 17)
$Time= GUICtrlCreateLabel(_NowTime()&" | "&_NowDate(), 8, 56, 175, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif");только чтоб красивей
GUICtrlSetColor(-1, 0x0000FF);только чтоб красивей

GUISetState(@SW_SHOW)


$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
GUICtrlSetData($nCount,$i)
Sleep($sek*1000)
$i=$i+1
WEnd
;$i - это число выполненых раз

Func _Exit()
Exit
EndFunc

Func _Hide()
If Not BitAND(WinGetState($hGui), 2) Then
GUISetState(@SW_SHOW, $hGui)
Else
GUISetState(@SW_HIDE, $hGui)
EndIf
EndFunc

sashadeg
06-05-2009, 20:18
:) Спасибо Огромное!!! Помог мне очень :)




© OSzone.net 2001-2012