Усложнение задачи регулярного выполнения. Гуру, помогите

Обсуждение программ nnCron и nnCron LITE

Усложнение задачи регулярного выполнения. Гуру, помогите

Postby Driverz » Thu, 26 Sep 2013, 21:24

Было две такие задачи и всё работало изумительно, до поры когда компьютер требуется держать включенным 24 часа в сутки.
Суть: в рабочие дни (полный рабочий день ПК просыпался в 8:30, а засыпал в 19:05), в субботу (ПК просыпался в 10:00, а засыпал в 14:35), в воскресенье ПК спал 24 часа.
В задаче -=Заводим будильник=- проверялся диапазон выходных/праздничных дней попадающих на будни (ПК должен был спать 24 часа)
В задаче -=Усыпляем=- проверялись рабочие субботы по рабочему календарю.
Code: Select all
#( -=Усыпляем=-
NoLog
SingleInstance
Rule: IDLE: 600 \ если кто-то работал последние десять минут, не выключаем
Action:
WDay@ 6 < INTERVAL: 08:30-19:05 AND
WDay@ 6 = INTERVAL: 10:00-14:35 AND OR
IF EXIT THEN

CUR-DATE [ 2010 11 13 YMD>DATE ] LITERAL = INTERVAL: 08:30-19:05 AND IF EXIT THEN
CUR-DATE [ 2011 03 05 YMD>DATE ] LITERAL = INTERVAL: 08:30-19:05 AND IF EXIT THEN
\ CUR-DATE [ 2012 12 29 YMD>DATE ] LITERAL = INTERVAL: 08:30-19:05 AND IF EXIT THEN
CUR-DATE [ 2013 01 09 YMD>DATE ] LITERAL = INTERVAL: 08:30-19:05 AND IF EXIT THEN

TQUERY: "Выключить компьютер?" 60 Yes \ здесь последняя попытка поймать выключение
IF
 LockWorkStation DROP \ блокируем сессию
 POWER-FORCE   
 POWER-SUSPEND
ELSE
THINT: "Отмена выключения" 30
THEN
)#

Code: Select all
#( -=Заводим будильник=-
TRUE VALUE found?
0 VALUE new_wake_date
WatchSuspend
Action:
CUR-DATE
CASE
    [ 2012 12 30 YMD>DATE ] LITERAL OF [ 2013 01 08 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ Н.Г.
    [ 2012 02 22 YMD>DATE ] LITERAL OF [ 2012 02 24 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 23ф
    [ 2013 03 07 YMD>DATE ] LITERAL OF [ 2013 03 10 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 8 марта
    [ 2013 04 30 YMD>DATE ] LITERAL OF [ 2013 05 05 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 1 мая
    [ 2013 05 08 YMD>DATE ] LITERAL OF [ 2013 05 12 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 9 мая
    [ 2013 06 11 YMD>DATE ] LITERAL OF [ 2013 07 12 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 12 июня
    [ 2013 11 03 YMD>DATE ] LITERAL OF [ 2013 11 05 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 5 ноября
    DUP OF FALSE TO found? ENDOF   \ совпадение не найдено
ENDCASE
found?   \ выбираем схему настройки
IF
 new_wake_date DATE>YMD 08 30 WakeAtDate
ELSE
 WDay@ 5 <
 IF
  WakeAt: "08:30"
 ELSE
  WDay@ 5 =
  IF
   WakeAt: "10:00"
  ELSE
   WakeAtWd: "08:30" 1
  THEN
 THEN
THEN
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
)#

а вот теперь после вынужденной необходимости нужно держать ПК включенным 24 часа в обычные дни/никаких автозасыпаний/просыпаний (ПК как бы полуавтоматический разговаривающий в нужные моменты робот, но ночью он должен молчать на все 100%).
Посему встала задача:
В обыкновенные дни в 19:05 (в штатную субботу в 14:05, а в рабочую субботу по полному графику в 19:05, в воскресенье 24часа в сутки) необходимо выключать полностью звук (MUTE-ить в 0% все устройства воспроизведения, а задач, которые пытаются в течении ночи что-либо "запиликать" в динамики полно), а в 8:30 в обыкновенные дни (в субботу в 10:00) необходимо наоборот раз-MUTE-тить все устройства воспроизведения, чтобы слышать что происходит с каждым приложением, которое пытается что-то "запиликать" в динамики. причем, при экстренных перезагрузках ПК, реинкарнациях nncron и т.д., нужно проверять "звуковой" диапазон и когда должен быть включен звук его включить, а если не должен (ночь) - выключить. И ещё нюанс: если ПК был выключен на праздничные дни (некий диапазон в -=Заводим будильник=-) он и должен спать в нем до первого рабочего дня, НО! если его разбудили, то пахать 24 часа, до принудительного выключения/сна/гибернации и опять же проснуться в первый рабочий день. Понимаю, что задача нетривиальная, сам уже себе за неделю всю голову сломал и обращаюсь к ВАМ, уважаемые ГУРУ, за помощью.
P.S. ПК (Win8 Pro x64), Есть ещё множество задач в кроне выполняющиеся периодически, но которым в НЕразрешенный диапазон времени запрещено подавать звуки, в этих задачах тоже нужно приглушать звук. .Чувствую, что нужно ввести некие глобальные переменные start_hour - час начала разрешенного периода времени, start_min - минуты начала разрешенного периода времени, stop_hour - час окончания разрешенного периода времени, stop_min - минуты окончания разрешенного периода времени, и использовать их в задачах на проверку в INTERVAL, но пока не получается у меня. С включение звука нет никаких проблем: 50 0 DO SEND-KEYS: {VOLUME_UP} LOOP, а вот с выключением звука есть, подобная команда: 50 0 DO SEND-KEYS: {VOLUME_DOWN} LOOP дает эффект, только если фокус окна находится на окне Микшера Громкости, если окна нет, то приглушение не срабатывает. Работа с регулировкой микшера этой программой невозможно, по причине х64 оси. Tcnm конечно координальное решение: net stop audiosrv для включения и net start audiosrv для включения вообще службы аудио в оси, пока только на этом решении остановился. Короче много заморочек.
Last edited by Driverz on Fri, 27 Sep 2013, 10:58, edited 4 times in total.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи. Гуру nncron помогите разобраться..

Postby AlikasS » Fri, 27 Sep 2013, 06:59

за Засыпание отвечает твоя задача -=Усыпляем=- сделай ее неактивной и все.
а вторая задача будет ловить WatchSuspend (перевод в режим "хибернейт" или режим пониженного энергопотребления)
как ты и хочешь. P.S. но не полное выключение!! в этом случае "будильник" не поставится.
вроде тут ничего сложного то?

по звуку
самое простое использовать стороннюю программу,
смотри например Регулировка звука и др. управление
с интервалами времени разберешься ?
пример
Code: Select all
#( мониторим_время
\ ежеминутно
Action:
CUR-DATE [ 2013 09 28 YMD>DATE ] LITERAL = INTERVAL: 08:30-19:05 AND IF \ рабочая суббота (предположительно)
\ ставим звук как надо
\ добавить самому!!!
EXIT \ и выходим
THEN

WDay@ 6 < INTERVAL: 08:30-19:05 AND WDay@ 6 = INTERVAL: 10:00-14:05 AND OR
IF
\ здесь рабочее время
ELSE
\ здесь не рабочее время
THEN
)#
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Усложнение задачи. Гуру nncron помогите разобраться..

Postby Driverz » Fri, 27 Sep 2013, 09:09

с этой задачей: #( мониторим_время
мы постоянно/ежеминутно будем дергать микшер на включение/выключение, что не есть гут.
хотелось бы что-то вроде:
Code: Select all
#( -=Усыпляем=-
NoLog
SingleInstance
Rule: IDLE: 600 \ если кто-то работал последние десять минут, не выключаем
Action:
INTERVAL: %dstart_hour%:%dstart_min%-%dstop_hour%:%dstop_min%
IF  EXIT THEN

CUR-DATE [ 2010 11 13 YMD>DATE ] LITERAL = INTERVAL: %start_hour%:%start_min%-%stop_hour%:%stop_min% AND IF EXIT THEN
CUR-DATE [ 2011 03 05 YMD>DATE ] LITERAL = INTERVAL: %start_hour%:%start_min%-%stop_hour%:%stop_min% AND IF EXIT THEN
CUR-DATE [ 2013 01 09 YMD>DATE ] LITERAL = INTERVAL: %start_hour%:%start_min%-%stop_hour%:%stop_min% AND IF EXIT THEN

TQUERY: "Выключить?" 60 Yes \ здесь последняя попытка поймать выключение
IF
 START-APP: net stop audiosrv
ELSE
 THINT: "Отмена выключения" 30
THEN
)#


Code: Select all
#( -=Пробуждаем=-
RunMissed: 1
Rule: Hour@ S" %start_hour%" S>NUM = Min@ S" %start_min%" S>NUM = AND
Action:
 START-APP: net start audiosrv
)#

но как корректно передавать в обе задачи: start_hour, start_min, stop_hour, stop_min% я пока не разобрался.
как в Rule: и INTERVAL передать? числовое там или строковое значение? допилить бы
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи. Гуру nncron помогите разобраться..

Postby Driverz » Fri, 27 Sep 2013, 09:21

Получение глобальных переменных я пытался таким макаром:
ибо в WakeAt... нужно использовать строковые переменные (ИМХО), а в INTERVAL и Rule вроде числовые. в утверждении чего я не берусь (запутался)
Code: Select all
<% -=Выставляем_будильник=-
TRUE VALUE found?
0 VALUE new_wake_date
08 VALUE dstart_hour
30 VALUE dstart_min
19 VALUE dstop_hour
05 VALUE dstop_min
CREATE start_hour 2 ALLOT
CREATE start_min 2 ALLOT
CREATE stop_hour 2 ALLOT
CREATE stop_min 2 ALLOT
S" 08" start_hour PLACE
S" 30" start_min PLACE
S" 19" stop_hour PLACE
S" 05" stop_min PLACE
Rule: WatchSuspend Hour@ 23 = Min@ 59 = AND OR \ ловим или выключение или время в преддверии полуночи для выставления параметров переменных на сл. день
Action:
CUR-DATE
CASE
\ проверка с первого дня периода выходных по последний день периода включительно
    [ 2012 12 30 YMD>DATE ] LITERAL OF [ 2013 01 08 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ Н.Г.
    [ 2012 02 22 YMD>DATE ] LITERAL OF [ 2012 02 24 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 23 февраля
    [ 2013 03 07 YMD>DATE ] LITERAL OF [ 2013 03 10 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 8 марта
    [ 2013 04 30 YMD>DATE ] LITERAL OF [ 2013 05 05 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 1 мая
    [ 2013 05 08 YMD>DATE ] LITERAL OF [ 2013 05 12 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 9 мая
    [ 2013 06 11 YMD>DATE ] LITERAL OF [ 2013 07 12 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 12 июня
    [ 2013 11 03 YMD>DATE ] LITERAL OF [ 2013 11 05 YMD>DATE ] LITERAL TO new_wake_date ENDOF \ 5 ноября
    DUP OF FALSE TO found? ENDOF   \ совпадение не найдено
ENDCASE
found?   \ выбираем схему настройки
IF
 new_wake_date DATE>YMD S" %start_hour COUNT%" S>NUM S" %start_min COUNT%" S>NUM WakeAtDate
ELSE
 WDay@ 5 <
 IF
  WakeAt: "%start_hour COUNT%:%start_min COUNT%"
 ELSE
  WDay@ 5 =
  IF
   S" 10" start_hour PLACE
   S" 00" start_min PLACE
   S" 14" stop_hour PLACE
   S" 35" stop_min PLACE
   10 TO dstart_hour
   00 TO dstart_min
   14 TO dstop_hour
   35 TO dstop_min
   WakeAt: "%start_hour COUNT%:%start_min COUNT%"
  ELSE
   S" 00" start_hour PLACE
   S" 01" start_min PLACE \ спецом ставим ,чтобы не сработало ниразу
   S" 00" stop_hour PLACE
   S" 00" stop_min PLACE
   00 TO dstart_hour
   01 TO dstart_min
   00 TO dstop_hour
   00 TO dstop_min
   WakeAtWd: "%start_hour COUNT%:%start_min COUNT%" 1
  THEN
 THEN
THEN
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
%>

судя из всего этого INTERVAL: %dstart_hour%:%dstart_min%-%dstop_hour%:%dstop_min%
и Rule: Hour@ S" %start_hour%" S>NUM = Min@ S" %start_min%" S>NUM = AND у меня не всасывают переменные :(
может быть (а я почему-то уверен, что может) есть возможность отказаться от второй четверки переменных и использовать только или числовые переменные или строковые. короче изобретаю велосипед.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby Driverz » Sat, 28 Sep 2013, 13:45

Уважаемые, VoidVolker и AlikasS, подскажите: есть ли возможночть как-то вставить числовые значения dstart_hour, dstart_min, dstop_hour, dstop_min в параметры к INTERVAL?
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby VoidVolker » Sun, 29 Sep 2013, 08:28

Code: Select all
CREATE start_hour 2 ALLOT
...
S" 08" start_hour PLACE
В массиве место только для одного символа - еще один байт занимает счетчик. Соответственно надо заменить 2 на 3. Или упростить и использовать обычные переменные - для двух или трех символов их хватит вполне.
Code: Select all
VARIABLE start_hour S" 08" start_hour PLACE
И какой смысл делать числовые переменные в строковом виде? Когда они все равно используются как числа. Первые же пять нормально - VALUE.

Code: Select all
S" %start_hour COUNT%" S>NUM
Даст на выходе ноль. Потому что это именно обычная строка и без чисел.
Code: Select all
start_hour COUNT S>NUM

Соответственно и в коде:
Code: Select all
Rule: Hour@ S" %start_hour%" S>NUM = Min@ S" %start_min%" S>NUM = AND
Сравнение времени идет с нулями.

Кроме того, делать запись вида:
Code: Select all
[ 2012 12 30 YMD>DATE ] LITERAL
Имеет смысл только в критически нагруженных местах с большими вычислениями, а тут получается все равно что выключить один пиксель на мониторе для экономии электроэнергии в масштабе планеты. Отдельный флаг тоже можно не использовать. Т.о. должно было получиться что-то вроде такого:
Code: Select all
#( -=Выставляем_будильник=-
0 VALUE new_wake_date
08 VALUE dstart_hour
30 VALUE dstart_min
19 VALUE dstop_hour
05 VALUE dstop_min
08 VALUE start_hour
30 VALUE start_min
19 VALUE stop_hour
05 VALUE stop_min
Rule: WatchSuspend Hour@ 23 = Min@ 59 = AND OR \ ловим или выключение или время в преддверии полуночи для выставления параметров переменных на сл. день
Action:
    CUR-DATE CASE    \ проверка с первого дня периода выходных по последний день периода включительно
        2012 12 30 YMD>DATE OF 2013 01 08 ENDOF \ Н.Г.
        2012 02 22 YMD>DATE OF 2012 02 24 ENDOF \ 23 февраля
        2013 03 07 YMD>DATE OF 2013 03 10 ENDOF \ 8 марта
        2013 04 30 YMD>DATE OF 2013 05 05 ENDOF \ 1 мая
        2013 05 08 YMD>DATE OF 2013 05 12 ENDOF \ 9 мая
        2013 06 11 YMD>DATE OF 2013 07 12 ENDOF \ 12 июня
        2013 11 03 YMD>DATE OF 2013 11 05 ENDOF \ 5 ноября
        DUP OF 0 0 0 ENDOF   \ совпадение не найдено
    ENDCASE
    YMD>DATE TO new_wake_date
    new_wake_date IF \ выбираем схему настройки
        new_wake_date DATE>YMD start_hour start_min WakeAtDate
    ELSE
        WDay@ 5 < IF
            WakeAt: "%start_hour%:%start_min%"
        ELSE
            WDay@ 5 = IF
                10 TO start_hour
                00 TO start_min
                14 TO stop_hour
                35 TO stop_min
                10 TO dstart_hour
                00 TO dstart_min
                14 TO dstop_hour
                35 TO dstop_min
                WakeAt: "%start_hour%:%start_min%"
            ELSE
                00 TO start_hour
                01 TO start_min \ спецом ставим ,чтобы не сработало ниразу
                00 TO stop_hour
                00 TO stop_min
                00 TO dstart_hour
                01 TO dstart_min
                00 TO dstop_hour
                00 TO dstop_min
                WakeAtWd: "%start_hour%:%start_min%" 1
            THEN
        THEN
    THEN
    ES_SYSTEM_REQUIRED ResetSuspendTimer
    ES_DISPLAY_REQUIRED ResetSuspendTimer
    ES_CONTINUOUS ResetSuspendTimer
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby Driverz » Sun, 29 Sep 2013, 14:27

большое спасибо, уважаемый, VoidVolker. понял, что можно обойтись 4мя переменными (числового типа)
Code: Select all
08 VALUE start_hour
30 VALUE start_min
19 VALUE stop_hour
05 VALUE stop_min

в проверке с Hour@ и Min@ они прекрасно встанут м сработают, а вот для INTERVAL как получить конструкцию из этих переменных?
Code: Select all
#( -=Пробуждаем=-
RunMissed: 1
Rule: Hour@ start_hour = Min@ start_min = AND
Action:
тут должно сработать?
Code: Select all
#( -=Усыпляем=-
NoLog
SingleInstance
Rule: IDLE: 600 \ если кто-то работал последние десять минут, не выключаем
Action:
INTERVAL: %start_hour%:%start_min%-%stop_hour%:%stop_min% IF EXIT THEN
а эта вот конструкция (ИМХО) не сработает.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby AlikasS » Sun, 29 Sep 2013, 16:35

VoidVolker wrote:Кроме того, делать запись вида:
Code: Select all
[ 2012 12 30 YMD>DATE ] LITERAL
Имеет смысл только в критически нагруженных местах с большими вычислениями, а тут получается все равно что выключить один пиксель на мониторе для экономии электроэнергии в масштабе планеты.

это я еще когда с литералами игрался, вставил запись, так все и копируют ))
зато можно отследить откуда код
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby VoidVolker » Sun, 29 Sep 2013, 16:53

Driverz wrote: а вот для INTERVAL как получить конструкцию из этих переменных?

Code: Select all
INTERVAL: "08:30-19:05"

=
Code: Select all
8 60 * 30 +   19 60 * 5 +   1 INTERVAL

INTERVAL ( min1 min2 step -- ? )
Для упрощения можно сделать так:
Code: Select all
: IS-INTERVAL?   \ ( h1 m1 h2 m2 step -- ? ) Возвращает флаг TRUE (-1), если текущее время попадает в указанный интервал.
\ Дополнительный  параметр step - это "шаг срабатывания" условия: время, прошедшее от начала интервала, кратно периоду step минут.
    >R 2SWAP      \ h2 m2 h1 m1  R: step
    SWAP 60 * +   \ h2 m2 t1
    SWAP ROT      \ t1 m2 h2
    60 * + R>     \ t1 t2 step
    INTERVAL
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby Driverz » Sun, 29 Sep 2013, 20:32

8 60 * 30 + 19 60 * 5 + 1 INTERVAL

отсюда я так понимаю нужно как раз сделать вывод:
Code: Select all
#( -=Усыпляем=-
NoLog
SingleInstance
Rule: IDLE: 600 \ если кто-то работал последние десять минут, не выключаем
Action:
start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL IF EXIT THEN
так?
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby Driverz » Sun, 29 Sep 2013, 21:55

вот такая конструкция должна сработать:
Code: Select all
#( -=Выставляем_будильник=- \ пусть каждую минуту получает время и дату просыпания+рабочего периода
NoLog
0 VALUE new_wake_date
08 VALUE start_hour
30 VALUE start_min
17 VALUE stop_hour
35 VALUE stop_min
Action:
CUR-DATE CASE \ проверка с первого дня периода выходных по последний день периода включительно
  2012 12 30 YMD>DATE OF 2013 01 08 ENDOF \ Н.Г.
  2012 02 22 YMD>DATE OF 2012 02 24 ENDOF \ 23 февраля
  2013 03 07 YMD>DATE OF 2013 03 10 ENDOF \ 8 марта
  2013 04 30 YMD>DATE OF 2013 05 05 ENDOF \ 1 мая
  2013 05 08 YMD>DATE OF 2013 05 12 ENDOF \ 9 мая
  2013 06 11 YMD>DATE OF 2013 07 12 ENDOF \ 12 июня
  2013 11 03 YMD>DATE OF 2013 11 05 ENDOF \ 5 ноября
  DUP OF 0 0 0 ENDOF   \ совпадение не найдено
ENDCASE
YMD>DATE TO new_wake_date
new_wake_date IF \ выбираем схему настройки
 new_wake_date DATE>YMD start_hour start_min WakeAtDate
ELSE
 WDay@ 5 <
 IF
  WakeAt: "%start_hour%:%start_min%"
 ELSE
  WDay@ 5 =
  IF
   10 TO start_hour
   00 TO start_min
   14 TO stop_hour
   35 TO stop_min
   WakeAt: "%start_hour%:%start_min%"
  ELSE
   00 TO start_hour
   01 TO start_min \ спецом ставим, чтобы не сработало ниразу
   00 TO stop_hour
   00 TO stop_min
   WakeAtWd: "%start_hour%:%start_min%" 1
  THEN
 THEN
THEN
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
)#

#( -=Усыпляем=-
NoLog
SingleInstance
Rule: IDLE: 600 \ если кто-то работал последние десять минут, не выключаем
Action:
start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL IF EXIT THEN
CUR-DATE 2010 11 13 YMD>DATE = start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL AND IF EXIT THEN
CUR-DATE 2011 03 05 YMD>DATE = start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL AND IF EXIT THEN
CUR-DATE 2013 01 09 YMD>DATE = start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL AND IF EXIT THEN

TQUERY: "Выключить?" 60 Yes \ здесь последняя попытка поймать выключение
IF
 START-APP: net stop audiosrv
ELSE
 THINT: "Отмена выключения" 30
THEN
)#

#( -=Пробуждаем=-
RunMissed: 1
Rule: Hour@ start_hour = Min@ start_min = AND
Action:
-=Выставляем_будильник=- LAUNCH
 START-APP: net start audiosrv
)#

но первая задача срабатывает только в начале минуты *:00, а как сделать, чтобы она срабатывала сразу после старта крона и ежеминутно?
думаю - это освободит от команды -=Выставляем_будильник=- LAUNCH последнюю задачу? или можно оставить так как есть? неперегружаться/заморачиваться?
а вот эти строки:
Code: Select all
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
не нужно как-то изолировать от ежеминутного выполнения? использовать нечто вроде WatchSuspend, но как? или неперегружаться/заморачиваться?
Уважаемый, VoidVolker,
Code: Select all
8 60 * 30 +   19 60 * 5 +   1 INTERVAL
в этой конструкции принципиальны три пробела перед числами 19 и 1?
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby VoidVolker » Mon, 30 Sep 2013, 06:10

Driverz wrote:в этой конструкции принципиальны три пробела перед числами 19 и 1?

Обычное форматирование для облегчения чтения кода. Форт различает в исходном коде только на два вида символов: символы слов и разделители. Я же немногим ранее привел более удобное IS-INTERVAL?, которое на вход принимает часы и минуты двух диапазоном и шаг.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby Driverz » Mon, 30 Sep 2013, 08:09

неужели
Code: Select all
IS-INTERVAL? start_hour start_min stop_hour stop_min 1 IF EXIT THEN
сработает лучше, чем
Code: Select all
start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL IF EXIT THEN
? прошу прощения за нубизм.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby VoidVolker » Mon, 30 Sep 2013, 13:27

Code: Select all
start_hour start_min stop_hour stop_min 1 IS-INTERVAL?

( h1 m1 h2 m2 step -- ? )
Слева - вход, справа - выход.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Усложнение задачи регулярного выполнения. Гуру, подмогни

Postby Driverz » Mon, 30 Sep 2013, 14:40

Code: Select all
start_hour start_min stop_hour stop_min 1 IS-INTERVAL? IF EXIT THEN
будет явно лучше работать чем:
Code: Select all
start_hour 60 * start_min + stop_hour 60 * stop_min + 1 INTERVAL IF EXIT THEN
? да?
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Exabot [Bot] and 2 guests

cron