Обратный отсчёт через HINT

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

Обратный отсчёт через HINT

Postby Morituruz » Sat, 18 Aug 2012, 16:31

Обратный отсчёт через хинт, который можно двигать.
Image

Нажимаем alt + ctrl + k, вводим время в минутах, вводим текст напоминания.

Первый вариант. Задача в кронтабе, запуск отсчёта отдельным потоком:
Code: Select all
<%
\ разрешение экрана
: xRes
GetDesktopSize DROP
;
: yRes
GetDesktopSize SWAP DROP
;
: mRes
GetDesktopSize + 2 /
;
: XN>S   \ ( x num -- a u ) \ Конвертировать x разрядов положительного числа в строку
  SWAP >R S>D <# R> 0 DO # LOOP #>
;



VARIABLE timer_hint_proc_id
VARIABLE timer_hint_win_id
CREATE timer_caption 256 ALLOT
VARIABLE timer_time
mRes 33 / CONSTANT screen_factor
:NONAME
10 * 500 + 60 SWAP BEEP
; TASK: BEEEP
: TIMER_RED_OSD_FONT
S" Verdana" mRes screen_factor / 0xA00000 OSD-FONT
;
:NONAME
ASCIIZ> DROP
4096 64 + S" Таймер" DROP ROT 0 MessageBoxA DROP
; TASK: NON_STOP_MSG
: NSMSG
DROP NON_STOP_MSG START DROP
;
: TIMER_GRAY_OSD_FONT
S" Verdana" mRes screen_factor / 0x505050 OSD-FONT
;
: TIMER_OSD_POS
WIN-POS mRes screen_factor / 8 / + SWAP mRes screen_factor / 3 / + SWAP OSD-POS
;
:NONAME { \ t a u thpi thwi -- }
ASCIIZ> S" /(\d+);(\d+);(\d+);(.+)/i" RE-MATCH
IF
   $1 S>NUM TO t
   $2 S>NUM TO thpi
   $3 S>NUM TO thwi
   $4 TO u TO a
ELSE
   MSG: "Ошибка в параметрах"
   EXIT
THEN
TRUE
t 0 DO
   thwi TIMER_OSD_POS
   t I - 16 <
   IF
      TIMER_RED_OSD_FONT
      \ the bomb has been planted:
      \ t I - BEEEP START DROP
   ELSE
      TIMER_GRAY_OSD_FONT
   THEN
   \ преобразуем время в секундах в формат mm:ss:
   a u S" : " S+
   t I - 60 /MOD N>S S" :" S+ ROT 2 SWAP XN>S S+
   S+ 2DUP OSD
   1000 PAUSE
   \ на случай передвижений окошка:
   thwi TIMER_OSD_POS
   \ закрашиваем текст цветом фона хинта:
   S" Verdana" mRes screen_factor / 0x999999 OSD-FONT
   OSD
   thpi N>S PROC-EXIST? NOT
   IF
      OSD-CLEAR
      INVERT
      LEAVE
   THEN
LOOP
IF
   \ здесь можно поместить дополнительные оповещения о том, что время кончилось:
   a u NSMSG
   0 BEEEP START DROP
   10 PAUSE
   10 BEEEP START DROP
THEN
BEGIN
   thpi N>S PROC-EXIST?
WHILE
   thwi TIMER_OSD_POS
   S" Verdana" mRes screen_factor / 0x999999 OSD-FONT
   a u S" : 0:00" S+ 2DUP OSD
   500 PAUSE
   thwi TIMER_OSD_POS
   TIMER_RED_OSD_FONT
   OSD
   500 PAUSE
REPEAT
; TASK: timer
%>

#( timer_by_hotkey
NoLog
SingleInstance
WatchHotKey: "@^(k)"
CREATE timer_string_buffer 256 ALLOT
Action:
WIN-INPUT-TEXT: "Таймер" "1. Время в минутах:" "5" 0
0=
IF
   S>NUM 60 * timer_time !
ELSE
   EXIT
THEN
WIN-INPUT-TEXT: "Таймер" "2. Событие:" "чайник" 0
0=
IF
   timer_caption PLACE
ELSE
   EXIT
THEN
yRes 20 / DUP RANDOM + DUP HINT-POS
S" Verdana" mRes screen_factor / HINT-FONT
0x999999 0x999999 HINT-COLOR
timer_caption COUNT S" : " S+
timer_time @ 60 /MOD DUP N>S SWAP DROP SWAP XN>S S" :" S+ ROT 2 SWAP XN>S S+ S+
HINT
PROC-ID timer_hint_proc_id !
\ в цикле ищем окошко, пока оно не найдётся:
0 timer_hint_win_id !
BEGIN
   50 PAUSE
   FOR-WINDOWS: "nnCron HINT window"
      0 SP@ WIN-HWND GetWindowThreadProcessId DROP timer_hint_proc_id @ =
      IF
         WIN-HWND timer_hint_win_id !
      THEN
   ;FOR-WINDOWS
   timer_hint_win_id @
UNTIL
" %timer_time @ N>S%;%timer_hint_proc_id @ N>S%;%timer_hint_win_id @ N>S%;"
timer_caption COUNT GLOBAL S+ LOCAL DROP timer START DROP
)#


Второй вариант. Запускаем таймер с помощью nncron.exe -runfile. Таким образом таймер работает независимо от основного nncron и не остановится от перечитывания кронтабов или падения главного nncron.exe.
В каталоге nncron нужно создать файл под названием "timer" с таким текстом:
Code: Select all
\ разрешение экрана

: xRes
GetDesktopSize DROP
;
: yRes
GetDesktopSize SWAP DROP
;
: mRes
GetDesktopSize + 2 /
;
: XN>S   \ ( x num -- a u ) \ Конвертировать x разрядов положительного числа в строку
  SWAP >R S>D <# R> 0 DO # LOOP #>
;

VARIABLE timer_hint_proc_id
VARIABLE timer_hint_win_id
CREATE timer_caption 256 ALLOT
VARIABLE timer_time
mRes 33 / CONSTANT screen_factor

:NONAME
10 * 500 + 60 SWAP BEEP
; TASK: BEEEP
:NONAME
ASCIIZ> DROP
4096 64 + S" Таймер" DROP ROT 0 MessageBoxA DROP
; TASK: NON_STOP_MSG
: NSMSG
DROP NON_STOP_MSG START DROP
;
: TIMER_RED_OSD_FONT
S" Verdana" mRes screen_factor / 0xA00000 OSD-FONT
;
: TIMER_GRAY_OSD_FONT
S" Verdana" mRes screen_factor / 0x505050 OSD-FONT
;
: TIMER_OSD_POS
WIN-POS mRes screen_factor / 8 / + SWAP mRes screen_factor / 3 / + SWAP OSD-POS
;
: timer { \ t a u thpi thwi -- }
ASCIIZ> S" /(\d+);(\d+);(\d+);(.+)/i" RE-MATCH
IF
   $1 S>NUM TO t
   $2 S>NUM TO thpi
   $3 S>NUM TO thwi
   $4 TO u TO a
ELSE
   MSG: "Ошибка в параметрах"
   EXIT
THEN
TRUE
t 0 DO
   thwi TIMER_OSD_POS
   t I - 16 <
   IF
      TIMER_RED_OSD_FONT
      \ the bomb has been planted:
      \ t I - BEEEP START DROP
   ELSE
      TIMER_GRAY_OSD_FONT
   THEN
   \ преобразуем время в секундах в формат mm:ss:
   a u S" : " S+
   t I - 60 /MOD N>S S" :" S+ ROT 2 SWAP XN>S S+
   S+ 2DUP OSD
   1000 PAUSE
   \ на случай передвижений окошка:
   thwi TIMER_OSD_POS
   \ закрашиваем текст цветом фона хинта:
   S" Verdana" mRes screen_factor / 0x999999 OSD-FONT
   OSD
   thpi N>S PROC-EXIST? NOT
   IF
      OSD-CLEAR
      INVERT
      LEAVE
   THEN
LOOP
IF
   \ здесь можно поместить дополнительные оповещения о том, что время кончилось:
   a u NSMSG
   0 BEEEP START DROP
   10 PAUSE
   10 BEEEP START DROP
THEN
BEGIN
   thpi N>S PROC-EXIST?
WHILE
   thwi TIMER_OSD_POS
   S" Verdana" mRes screen_factor / 0x999999 OSD-FONT
   a u S" : 0:00" S+ 2DUP OSD
   500 PAUSE
   thwi TIMER_OSD_POS
   TIMER_RED_OSD_FONT
   OSD
   500 PAUSE
REPEAT
;


: main
WIN-INPUT-TEXT: "Таймер" "1. Время в минутах:" "5" 0
0=
IF
   S>NUM 60 * timer_time !
ELSE
   EXIT
THEN
WIN-INPUT-TEXT: "Таймер" "2. Событие:" "чайник" 0
0=
IF
   timer_caption PLACE
ELSE
   EXIT
THEN
yRes 20 / DUP RANDOM + DUP HINT-POS
S" Verdana" mRes screen_factor / HINT-FONT
0x999999 0x999999 HINT-COLOR
timer_caption COUNT S" : " S+
timer_time @ 60 /MOD DUP N>S SWAP DROP SWAP XN>S S" :" S+ ROT 2 SWAP XN>S S+ S+
HINT
PROC-ID timer_hint_proc_id !
\ в цикле ищем окошко, пока оно не найдётся:
0 timer_hint_win_id !
BEGIN
   50 PAUSE
   FOR-WINDOWS: "nnCron HINT window"
      0 SP@ WIN-HWND GetWindowThreadProcessId DROP timer_hint_proc_id @ =
      IF
         WIN-HWND timer_hint_win_id !
      THEN
   ;FOR-WINDOWS
   timer_hint_win_id @
UNTIL
" %timer_time @ N>S%;%timer_hint_proc_id @ N>S%;%timer_hint_win_id @ N>S%;"
timer_caption COUNT GLOBAL S+ LOCAL DROP timer
;


В кронтаб добавить простую задачу для запуска по горячей клавише:
Code: Select all
#( timer_by_hotkey
NoLog
WatchHotKey: "@^(k)"
Action:
START-APP: nncron.exe -runfile timer
)#



Предыстория вопроса с участием самого Николаса Немцова.
Ещё одна предыстория :)
Last edited by Morituruz on Mon, 10 Sep 2012, 14:24, edited 1 time in total.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Обратный отсчёт через HINT

Postby Morituruz » Thu, 23 Aug 2012, 09:36

Обновлено: добавлен вариант с запуском отсчёта отдельным процессом, чтобы таймер тикал независимо от того, что происходит с главным процессом nncron.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

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

cron