Счетчик Idle сходит с ума.

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

Счетчик Idle сходит с ума.

Postby Fornit » Fri, 12 Oct 2018, 23:43

Написал скрипт, который считает время простоя и выводит его в виде web-страницы.
Примерно так:
https://i.imgur.com/ko5UzUq.jpg

Вот он сам:
Spoiler: show
Code: Select all

#( WebTimeStamp
SingleInstance
Action:

  S" %WDay@ 159 + RES%, %DD%/%MM%/%YYYY%%crlf%Uptime: %UPTIME 60 / 60 / 24 /%d %UPTIME 60 / 60 / 24 MOD%:%UPTIME 60 / 60 MOD%:%UPTIME 60 MOD%" EVAL-SUBST
  CronIcon ModifyText

  S" >> Uptime: %UPTIME 60 / 60 / 24 /%d %UPTIME 60 / 60 / 24 MOD%:%UPTIME 60 / 60 MOD%:%UPTIME 60 MOD%  Idle: %GetIdleTime 1000 / 60 / 60 / 24 /%d %GetIdleTime 1000 / 60 / 60 / 24 MOD%:%GetIdleTime 1000 / 60 / 60 MOD%:%GetIdleTime 1000 / 60 MOD%" CRON-LOG

    FILE-WRITE:  "C:\Utils\root\www\index.html" "<title>My computer</title><center>%DD%/%MM%/%YYYY% %WDay@ 159 + RES%<br><b>%hh%:%mm%</b><br>Idle: %GetIdleTime 1000 / 60 / 60 / 24 /%d %GetIdleTime 1000 / 60 / 60 / 24 MOD%h %GetIdleTime 1000 / 60 / 60 MOD%m %GetIdleTime 1000 / 60 MOD%s<br>"
    FILE-APPEND: "C:\Utils\root\www\index.html" "Up: %UPTIME 60 / 60 / 24 /%d %UPTIME 60 / 60 / 24 MOD%h %UPTIME 60 / 60 MOD%m %UPTIME 60 MOD%s<br>"

    ES_SYSTEM_REQUIRED ResetSuspendTimer

)#



А вот логи.
Spoiler: show
Code: Select all
05/10/18 14:07:00 15352 TASK: WebTimeStamp
05/10/18 14:07:00 15352 >> Uptime: 26d 11:22:47  Idle: 24d 20:29:10
05/10/18 14:08:00 14532 TASK: WebTimeStamp
05/10/18 14:08:00 14532 >> Uptime: 26d 11:23:47  Idle: 24d 20:30:9
05/10/18 14:09:00 6264 TASK: WebTimeStamp
05/10/18 14:09:00 6264 >> Uptime: 26d 11:24:46  Idle: 24d 20:31:9
05/10/18 14:10:00 14180 TASK: WebTimeStamp
05/10/18 14:10:00 14180 >> Uptime: 26d 11:25:47  Idle: -24d -20:-30:-37
05/10/18 14:11:00 4048 TASK: WebTimeStamp
05/10/18 14:11:00 4048 >> Uptime: 26d 11:26:46  Idle: -24d -20:-29:-37
05/10/18 14:12:00 14548 TASK: WebTimeStamp
05/10/18 14:12:00 14548 >> Uptime: 26d 11:27:47  Idle: -24d -20:-28:-37
05/10/18 14:13:00 11308 TASK: WebTimeStamp
05/10/18 14:13:00 11308 >> Uptime: 26d 11:28:46  Idle: -24d -20:-27:-37


Вы видите какая фигня, да? Внезапно, по достижению определенного значения, время простоя меняет знак, и, соотв, начинает отсчитываться "назад".
Откуда такой глючище вылезает? Не в первый раз уже.
Также, все советы по усовершенствованию скрипта будут приняты с благодарностью.

FIDO - Дружбомагия форевер! ;)
User avatar
Fornit
 
Posts: 45
Joined: Fri, 28 Apr 2006, 22:04

Re: Счетчик Idle сходит с ума.

Postby dothen » Sun, 14 Oct 2018, 16:37

Слово GetIdleTime работает так:
"Системная функция GetLastInputInfo возвращает количество миллисекунд
прошедшее от старта системы до момента последнего ввода.
Время бездействия вычисляется как арифметическая разница между данными,
возвращаемыми функцией GetTickCount и данными из GetLastInputInfo."

"GetTickCount - это системная функция, которая возвращает число одинарной длины со знаком.
Это означает, что через 49,7 дней непрерывной работы компьютера значение GetTickCount
переполнится и снова начнет отсчитываться с нуля."

Максимальное значение числа одинарной длины со знаком +2147483647
Максимальное значение числа одинарной длины без знака 4294967295
Code: Select all
4294967295
 Ok ( 4294967295(-1) )
.
-1  Ok

4294967295
 Ok ( 4294967295(-1) )
U.
4294967295  Ok

2147483647 1000 / sec>dd.hh:mm:ss TYPE
24 дн. 20:31:23 Ok

4294967295 1000 U/ sec>dd.hh:mm:ss TYPE
49 дн. 17:02:47 Ok

4294967295 sec>dd.hh:mm:ss TYPE
49710 дн. 06:28:15 Ok

Задача может вычислять время бездействия двумя способами:
1) так же как GetIdleTime но более корректно.
2) просто сравнивая два последних значения GetLastInputInfo - если они равны значит не было действий.
Code: Select all
#( WebTimeStamp
SingleInstance

: GetLastInput ( -- n ) 0 8 SP@ GetLastInputInfo 2DROP ;

TRUE [IF] \ Через 49 дн. 17:02:47 непрерывной работы компьютера значение GetTickCount (возвращает миллисекунды) переполнится и снова начнет отсчитываться с нуля.
: GetIdleTime2 ( -- sec )
    GetTickCount 1000 U/ GetLastInput 1000 U/ -
;
[ELSE] \ Через 49710 дн. 06:28:15 непрерывной работы компьютера значение UPTIME (возвращает секунды) переполнится и снова начнет отсчитываться с нуля :).
0 VALUE LastUptime
0 VALUE LastInput
0 VALUE idle

: ResetVal ( -- )
      GetLastInput TO LastInput
      UPTIME TO LastUptime
      0 TO idle
;
ResetVal

: GetIdleTime2 ( -- sec )
    GetLastInput LastInput =
    IF
      UPTIME LastUptime - TO idle
    ELSE
      ResetVal
    THEN
    idle
;
[THEN]

: sec>dd.hh:mm:ss ( sec -- a u )
    U>D
    86400 UM/MOD SWAP 3600 /MOD SWAP 60 /MOD SWAP
    <#
      t:00 t:00 t00
      S"  дн. " HOLDS
      S>D #S
    #>
;

: UptimeStr ( -- a u ) UPTIME sec>dd.hh:mm:ss ;
: IdleStr ( -- a u ) GetIdleTime2 sec>dd.hh:mm:ss ;
: CurDate ( -- a u ) S" %WDay@ 159 + RES%, %DD%/%MM%/%YYYY%" EVAL-SUBST

Action:
    S" %CurDate%%crlf%Uptime: %UptimeStr%" EVAL-SUBST
    set-tray-text

    S" >> Uptime: %UptimeStr%  Idle: %IdleStr%" CRON-LOG

    FILE-WRITE:  "C:\Utils\root\www\index.html" "<title>My computer</title><center>%CurDate%<br><b>%hh%:%mm%</b><br>Idle: %IdleStr%<br>Up: %UptimeStr%<br>"

    ES_SYSTEM_REQUIRED ResetSuspendTimer

)#
dothen
 
Posts: 198
Joined: Mon, 16 Mar 2015, 04:58

Re: Счетчик Idle сходит с ума.

Postby Fornit » Sun, 14 Oct 2018, 22:15

Спасибо!
User avatar
Fornit
 
Posts: 45
Joined: Fri, 28 Apr 2006, 22:04


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests

cron