Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Повторение кода через промежуток времени (http://forum.oszone.net/showthread.php?t=139231)

sashadeg 03-05-2009 20:36 1109872

Повторение кода через промежуток времени
 
Помогите пожалуйста...

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

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

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

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

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

SyDr 03-05-2009 22:48 1109978

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

Этот вариант работает, елси твои действия выполняются достаточно быстро. В противном случае делай корректировки или, если невозможно предугадать, сколько времени будут выполняться нужные действия - используй 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 1110094

Вот, только в качестве наводки на путь размышления этот пример. Он не полностью рабочий, ибо нужно еще реализовать форматирование время при сложении (например если сложить @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 1110427

Цитата:

Цитата 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 04-05-2009 15:12 1110454

Цитата:

Цитата 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 04-05-2009 15:18 1110462

А хорошо бы сделать, ещё 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 1110530

Цитата:

Цитата 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 04-05-2009 19:31 1110645

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

#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 1110672

Цитата:

Цитата sashadeg
Как внедрить сюды GUI »

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

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

sashadeg 04-05-2009 21:22 1110717

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

beve 04-05-2009 22:36 1110767

Цитата:

Цитата sashadeg
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 1112271

:) Спасибо Огромное!!! Помог мне очень :)


Время: 22:54.

Время: 22:54.
© OSzone.net 2001-