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

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

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

Postby VoidVolker » Mon, 30 Sep 2013, 15:48

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

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

Postby Driverz » Wed, 02 Oct 2013, 08:54

перелопатил весь код. для проверки "живности" звука использовал WINAMP плеер. вот из этого что получилось:
Code: Select all
<% TRUE VALUE Switch %>

#( -=Switch=-
: Winamp
S" Winamp*" PROC-EXIST? Switch AND IF EXIT
ELSE
 Switch IF
  SWHide ShowNoActivate
  START-APPW: nircmd.exe mutesysvolume 0
  START-APPW: nircmd.exe setsysvolume 65535
  ShowMinimized
  START-APP: C:\Program Files (x86)\Winamp\winamp.exe
  BEGIN S" Winamp*" PROC-EXIST? 100 PAUSE UNTIL
  WINAMP-PLAY
  S" -=Звук ON=-, дата будильника:%new_wake_date%, день недели:%WDay@%" CRON-LOG
 ELSE
  SWHide ShowNoActivate
  START-APPW: nircmd.exe mutesysvolume 1
  S" Winamp*" PROC-EXIST? IF S" Winamp*" KILL THEN
  S" -=Звук OFF=-, дата будильника:%new_wake_date%, день недели:%WDay@%" CRON-LOG
 THEN
THEN
;
NoLog
SingleInstance
Action:
\ проверяем дни молчания
DATE-INTERVAL: 03.11.2013-04.11.2013    \ 5 ноября
DATE-INTERVAL: 01.01.2014-08.01.2014 OR \ Н.Г.
DATE-INTERVAL: 23.02.2014-24.02.2014 OR \ 23 февраля
DATE-INTERVAL: 08.03.2014-10.03.2014 OR \ 8 марта
DATE-INTERVAL: 01.05.2014-05.05.2014 OR \ 1 мая
DATE-INTERVAL: 09.05.2014-12.05.2014 OR \ 9 мая
DATE-INTERVAL: 12.06.2014-12.06.2014 OR \ 12 июня
DATE-INTERVAL: 04.11.2014-04.11.2014 OR \ 5 ноября
IF FALSE TO Switch WinAmp EXIT THEN
\ проверяем рабочее время будней
WDay@ 6 < INTERVAL: 08:30-17:35 AND 
WDay@ 6 = INTERVAL: 10:00-14:05 AND OR
\ проверяем рабочие субботы
CUR-DATE 2010 11 13 YMD>DATE = INTERVAL: 08:30-17:35 AND OR
CUR-DATE 2011 03 05 YMD>DATE = INTERVAL: 08:30-17:35 AND OR
IF TRUE TO Switch WinAmp EXIT THEN
Switch GetIdleTime 600000 > AND  \ если кто-то работал последние десять минут, не выключаем
IF
  TQUERY: "Выключить?" 60 Yes \ здесь последняя попытка поймать выключение
  IF FALSE TO Switch WinAmp EXIT
  ELSE THINT: "Отмена выключения" 30
  THEN
THEN
)#
nircmd.exe делаем общедоступным для Win8 (кладем в c:\windows)

будильник оставил так как есть с ориентиром на WatchSuspend. единственно что, ввел DATE-INTERVAL на случай если пробудить ПК в период праздников и потом усыпить его, то есть желание проснуться в первый рабочий день, а не на сл день после усыпления.
Code: Select all
#( -=Выставляем_будильник=-
0 VALUE new_wake_date
WatchSuspend
Action:
CUR-DATE CASE \ проверка с последнего дня перед периодом выходных по первый рабочий день
  DATE-INTERVAL: 04.11.2013-04.11.2013 OF 2013 11 05 ENDOF \ 5 ноября 2013
  DATE-INTERVAL: 31.12.2012-08.01.2014 OF 2014 01 09 ENDOF \ Н.Г.
  DATE-INTERVAL: 22.02.2014-23.02.2014 OF 2014 02 24 ENDOF \ 23 февраля
  DATE-INTERVAL: 07.03.2014-10.03.2014 OF 2014 03 11 ENDOF \ 8 марта
  DATE-INTERVAL: 30.04.2014-04.05.2014 OF 2014 05 05 ENDOF \ 1 мая
  DATE-INTERVAL: 08.05.2014-11.05.2014 OF 2014 05 12 ENDOF \ 9 мая
  DATE-INTERVAL: 11.06.2014-15.06.2014 OF 2014 06 16 ENDOF \ 12 июня
  DATE-INTERVAL: 01.11.2014-04.11.2014 OF 2014 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 08 30 WakeAtDate
ELSE
 WDay@ 5 <
 IF
  WakeAt: "08:30"
 ELSE
  WDay@ 5 =
  IF
   WakeAtWd: "10:00"
  ELSE
   WakeAtWd: "08:30" 1
  THEN
 THEN
THEN
ES_CONT-SYSREQ-DISPREQ ResetSuspendTimer
)#
пришлось ввести пустышку для отслеживания GetIdleTime, ибо почему-то в моей Win8(x64) <% InitIdleHook %> ввел ПК в полный ступор (все окна отказались откликаться/зависон), может, ГУРУ по этому поводу что подскажут?
Code: Select all
<%
NoActive
Rule: IDLE: 180000
Action:
%>
Уважаемые, ГУРУ, подскажите, может как-то можно оптимизировать задачу -=Switch=- ?
Last edited by Driverz on Fri, 04 Oct 2013, 16:12, edited 7 times in total.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

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

Postby Morituruz » Wed, 02 Oct 2013, 10:20

Driverz wrote:<% InitIdleHook %> ввел ПК в полный ступор

Подтверждаю на Win2003 x64, вешает все окна от процессов с x64 архитектурой (32-битные окна работают вроде).
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

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

Postby SeMa » Wed, 02 Oct 2013, 15:36

Driverz wrote:
Code: Select all
#( -=Выставляем_будильник=-
0 VALUE new_wake_date
WatchSuspend
Action:
CUR-DATE CASE \ проверка с последнего дня перед периодом выходных по первый рабочий день
...

отсюда? Писал для случая без внезапного появления на работе :) .

Зачем в задаче
Code: Select all
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
?
Это три разных функции (см. плагин rstimer.spf). Чтобы выполнить эти функции одновременно, нужно создать новую константу (я у себя подправил плагин):
Code: Select all
0x80000003 CONSTANT ES_CONT-SYSREQ-DISPREQ
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

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

Postby Driverz » Wed, 02 Oct 2013, 16:05

SeMa wrote:отсюда?
нет. чуток попозднее разработка.
а по-простому для чего же нужны?:
Code: Select all
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

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

Postby SeMa » Wed, 02 Oct 2013, 16:18

Driverz wrote:а по-простому для чего же нужны?:

Сейчас уже не помню, насколько долго экспериментировал до того, как слепил
Code: Select all
0x80000001 CONSTANT ES_CONT-SYSREQ

В тексте плагина есть описание (на английском). А смысл:
Обнуляет system suspend timer. (Это может пригодиться, например, для того, чтобы компьютер не погружался снова в sleep mode через пять минут после автоматического пробуждения, если отсутствует пользовательская активность).
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

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

Postby Driverz » Wed, 02 Oct 2013, 19:08

SeMa wrote:
Code: Select all
0x80000001 CONSTANT ES_CONT-SYSREQ

на сайте нашел только последний rstimer.spf. в нем нет нового определения. где можно взять новый rstimer.spf?и как и где в новом rstimer.spf нужно определять конструкцию вместо:
Code: Select all
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

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

Postby SeMa » Thu, 03 Oct 2013, 10:41

Driverz wrote:
SeMa wrote:на сайте нашел только последний ...

А его нового и нет. Я себе сам "обновил":
Code: Select all
\ File:        rstimer.spf
\ Author:      Oleg Romanovich (2:450/173)
\ Description: Prevent resume 5-minutes sleep mode after automatically wake-up

\ If windows wakes-up automatically (for example, timer wake-up),
\ it resume sleep or hibernate mode after about 5 minutes, when the user
\ activity not detected and no scheduling tasks are running.
\ Periodically (once for 2-5 minutes) calling ResetSuspendTimer prevent
\ this situation.

\ Usage: <Param> ResetSuspendTimer
\         Param: ES_SYSTEM_REQUIRED  Informs the system that the thread is
\                                    performing some operation that is not
\                                    normally detected as activity by the
\                                    system.
\                ES_DISPLAY_REQUIRED Informs the system that the thread is
\                                    performing some operation that is not
\                                    normally detected as display activity
\                                    by the system.
\                ES_CONTINUOUS       Informs the system that the state being
\                                    set should remain in effect until the
\                                    next call that uses ES_CONTINUOUS and
\                                    one of the other state flags is cleared.

\ Example: ES_SYSTEM_REQUIRED ResetSuspendTimer

0x00000001 CONSTANT ES_SYSTEM_REQUIRED
0x00000002 CONSTANT ES_DISPLAY_REQUIRED
0x80000000 CONSTANT ES_CONTINUOUS
0x80000003 CONSTANT ES_CONT-SYSREQ-DISPREQ  \ all of above (additor: SeMa)
0x80000001 CONSTANT ES_CONT-SYSREQ          \ (additor: SeMa)

WINAPI: SetThreadExecutionState KERNEL32.DLL
WINAPI: IsSystemResumeAutomatic KERNEL32.DLL

: ResetSuspendTimer { param -- }
 IsSystemResumeAutomatic
 IF
   param SetThreadExecutionState DROP
 THEN
;
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

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

Postby Driverz » Thu, 03 Oct 2013, 11:11

изменил плагин. перезагрузил nncron.
вместо:
Code: Select all
ES_SYSTEM_REQUIRED ResetSuspendTimer
ES_DISPLAY_REQUIRED ResetSuspendTimer
ES_CONTINUOUS ResetSuspendTimer

написал:
Code: Select all
ES_CONT-SYSREQ-DISPREQ ResetSuspendTimer

так?
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

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

Postby SeMa » Thu, 03 Oct 2013, 17:40

Driverz wrote:так?

Да.
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

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

Postby Driverz » Fri, 04 Oct 2013, 16:08

Гуру, неужели нельзя оптимизировать задачу? Может быть можно как-то избавиться от WinAmp вообще? Чувствую, что нужно как-то воропятить с флагами, но испорчен в молодости языками высокого уровня и не могу адекватно воспринимать конструкции форта.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

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

Postby VoidVolker » Fri, 04 Oct 2013, 18:39

Задачу нужно запускать в какое-то определенное время? А что мешает использовать спецификацию времени?
Code: Select all
Time: <Minutes> <Hours> <Days> <Months> <WeekDays> <Years>
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

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

Postby Driverz » Mon, 07 Oct 2013, 08:20

VoidVolker wrote:Задачу нужно запускать в какое-то определенное время?

в чём и дело-то, что не в определенное, а периодически. думал проверять /10 минут, но остановился на ежеминутной проверке, так будет надежнее.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

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

Postby VoidVolker » Mon, 07 Oct 2013, 09:52

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

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

Postby Driverz » Mon, 07 Oct 2013, 10:52

крон-формат запуска я вроде изучил. тут фишка в том, что ПК может быть перезагружен в любой момент. значит надо проверять "тишина/звук" после загрузки. nncron может быть выведен из непотопляемого режима, тоже надо проверить, и так далее, множество нюансов проверки режима "тишина/звук", поэтому я остановился на поминутной проверке. вроде всё работает. а как ВЫ, уважаемый, VoidVolker выразились: у кода есть только два состояния: работает или нет (с). вот я и остановился на этом, но что-то мне подсказывает, что если работает - не трогай.
Driverz
 
Posts: 125
Joined: Fri, 06 Mar 2009, 13:06

Previous

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests

cron