Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Повторение кода через промежуток времени

Ответить
Настройки темы
[решено] Повторение кода через промежуток времени

Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


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

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

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

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

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

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

Отправлено: 20:36, 03-05-2009

 

Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


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

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

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:48, 03-05-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


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

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Последний раз редактировалось beve, 04-05-2009 в 14:11.

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:35, 04-05-2009 | #3


Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:41, 04-05-2009 | #4


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


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

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:12, 04-05-2009 | #5


Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


А хорошо бы сделать, ещё 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,... то программа запустится но никогда не начнётся....

-------
Ну вы ребята даёте...


Отправлено: 15:18, 04-05-2009 | #6


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


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

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Последний раз редактировалось beve, 04-05-2009 в 18:14.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:23, 04-05-2009 | #7


Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


Смотри, вот мой пример:
Код: Выделить весь код
#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.
Если честно, то я мало понимаю, что ты тут написал ^^

-------
Ну вы ребята даёте...


Последний раз редактировалось sashadeg, 04-05-2009 в 19:46.


Отправлено: 19:31, 04-05-2009 | #8


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


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

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

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Последний раз редактировалось beve, 04-05-2009 в 20:16.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:04, 04-05-2009 | #9


Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


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

-------
Ну вы ребята даёте...


Отправлено: 21:22, 04-05-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Повторение кода через промежуток времени

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] скрипт для нажатия клавиши F2 через опр. промежуток времени Bushbasher AutoIt 2 13-01-2010 12:53
[решено] Запуск определенной программы через n времени??? Anarasius AutoIt 14 20-09-2009 01:31
Помогите отключить интернет на короткий промежуток времени! minutka15 AutoIt 6 07-09-2009 10:52
Требуется настроить выполнение sh скрипта на unix через определеный промежуток времен backgam Программирование в *nix 8 05-05-2009 18:15
[решено] Запуск программы через случайные интервалы времени hitomi AutoIt 2 04-04-2009 19:04




 
Переход