Работа с реальным временем, туплю…

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

Работа с реальным временем, туплю…

Postby ANR Daemon » Sun, 27 Sep 2015, 19:20

Есть задача, предположим, нажимание кнопки в приложении.
Code: Select all
0 TO DE_INTR
BEGIN
    HK_hWnd N>S WIN-EXIST?
    IF
      0 VK_F1 WM_KEYDOWN HK_hWnd SendMessageA DROP
      user_KeyUpFlags VK_F1 WM_KEYUP HK_hWnd SendMessageA DROP
      2000 PAUSE
    THEN
DE_INTR UNTIL

Кнопку надо нажимать каждые две секунды. Независимо от того, сколько ушло времени на её нажимание.
В таком виде, как есть, цикл постоянно дрейфует в сторону увеличения интервалов.
Как бы от этого избавиться?
Читал хелп, не могу найти, к чему привязаться. Если только к UPTIME?
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: Работа с реальным временем, туплю…

Postby Wyz » Sun, 27 Sep 2015, 21:23

GetTickCount ?
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Работа с реальным временем, туплю…

Postby Morituruz » Sun, 27 Sep 2015, 23:02

Ну раз нажатие кнопки занимает какое-то ощутимое время, то логично вынести его в отдельную задачу/слово, которое будет запускаться в отдельном потоке.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Работа с реальным временем, туплю…

Postby dothen » Sun, 27 Sep 2015, 23:21

ANR Daemon wrote:Кнопку надо нажимать каждые две секунды. Независимо от того, сколько ушло времени на её нажимание.
В таком виде, как есть, цикл постоянно дрейфует в сторону увеличения интервалов.
Как бы от этого избавиться?
Читал хелп, не могу найти, к чему привязаться. Если только к UPTIME?


Вот примеры.
Тут интервалы практически одинаковые и главное не происходит сдвига.
Code: Select all
#( Waitsec-1
SingleInstance NoActive
VARIABLE sc
 : WAIT-SEC_1   \ ( u -- )
    BEGIN DUP UPTIME > WHILE
       10 PAUSE
    REPEAT DROP
 ;
Action:
UPTIME sc !
22 0 DO
sc @ 2+ DUP sc !
WAIT-SEC_1
20 2000 BEEP
LOOP
)#

#( Waitsec-2
SingleInstance NoActive
VARIABLE msc
 : WAIT-SEC_2   \ ( u -- )
    BEGIN DUP GetTickCount > WHILE
       10 PAUSE
    REPEAT DROP
 ;
Action:
GetTickCount msc !
22 0 DO
msc @ 2000 + DUP msc !
WAIT-SEC_2
20 2000 BEEP
100 PAUSE
20 2000 BEEP
LOOP
)#

#( Waitsec-3
SingleInstance NoActive
2VARIABLE nsc
 : WAIT-SEC_3   \ ( ud -- )
    BEGIN 2DUP FT-CUR D< 0= WHILE
        10 PAUSE
    REPEAT 2DROP
 ;
Action:
FT-CUR nsc 2!
22 0 DO
nsc 2@ 20000000. D+ 2DUP nsc 2!
WAIT-SEC_3
20 2000 BEEP
100 PAUSE
20 2000 BEEP
100 PAUSE
20 2000 BEEP
LOOP
)#
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Работа с реальным временем, туплю…

Postby ANR Daemon » Mon, 28 Sep 2015, 13:44

Что-то такое в голове крутилось, но голова от Форта отвыкла. :)
Спасибо, буду разбираться!

P.S.
За SingleInstance отдельное спасибо! :D Я весь хелп облазил.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: Работа с реальным временем, туплю…

Postby ANR Daemon » Tue, 29 Sep 2015, 20:17

Долго тупил, откуда у меня мусор на стеке :D
А первый UPTIME то и забыл :D
Code: Select all
: WaitASec ( -- )
  UPTIME
  BEGIN
    DUP UPTIME < NOT WHILE
    50 PAUSE
  REPEAT
  DROP
;


И сама задача…
Code: Select all
HK_hWnd N>S WIN-EXIST? NOT IF
  S" Client window not found. Save (Win+S) it first." -1 TimeMsgBox
ELSE
  0 TO DE_INTR
  BEGIN
    WaitASec
    HK_hWnd N>S WIN-EXIST?
    IF
      0 VK_F1 WM_KEYDOWN HK_hWnd SendMessageA DROP
      user_KeyUpFlags VK_F1 WM_KEYUP HK_hWnd SendMessageA DROP
    THEN
    WaitASec
  DE_INTR UNTIL
  S" Done with stuff." 2 TimeMsgBox
THEN
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: Работа с реальным временем, туплю…

Postby dothen » Wed, 30 Sep 2015, 22:29

Вместо
Code: Select all
S" Client window not found. Save (Win+S) it first." -1 TimeMsgBox

можно так
Code: Select all
S" Client window not found. Save (Win+S) it first." MsgBox

бесконечный цикл лучше так
Code: Select all
BEGIN
...
AGAIN

Вот так попробуй :arrow:
Code: Select all
<%
VARIABLE ssec

: WaitASec ( u -- )
  BEGIN
    DUP UPTIME > WHILE
    50 PAUSE
  REPEAT
  DROP
;
%>

UPTIME ssec !
BEGIN
HK_hWnd N>S WIN-EXIST? NOT IF
  S" Client window not found. Save (Win+S) it first." MsgBox
UPTIME ssec !
ELSE
ssec @ 2+ DUP ssec ! \ UPTIME + 2 секунды
    WaitASec
    HK_hWnd N>S WIN-EXIST?
    IF
      0 VK_F1 WM_KEYDOWN HK_hWnd SendMessageA DROP
      user_KeyUpFlags VK_F1 WM_KEYUP HK_hWnd SendMessageA DROP
    THEN
\  S" Done with stuff." 2 TimeMsgBox
THEN
AGAIN

Исправил.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Работа с реальным временем, туплю…

Postby ANR Daemon » Tue, 06 Oct 2015, 05:34

Спасибо, я знаю, как организовывается бесконечный цикл. Если ты обратил внимание, у меня он там отнюдь не бесконечный.
А использовать MsgBox или TimeMsgBox - это вообще как спорить о цвете устриц. Причём уже съеденных устриц.
TimeMsgBox просто мне лично удобнее. Я могу в любое время поправить таймаут туда и сюда.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: Работа с реальным временем, туплю…

Postby ANR Daemon » Tue, 06 Oct 2015, 05:37

dothen wrote:Вот так попробуй :arrow:
Code: Select all
<%
VARIABLE ssec

: WaitASec ( u -- )
  BEGIN
    DUP UPTIME > WHILE
    50 PAUSE
  REPEAT
  DROP
;
%>

Нафига?… При том, что теряется смысл слова. Мне вполне достаточно того, что происходит выравнивание на границу секунды (не очень точно, но мне хватает… и точность можно улучшить при необходимости).
Last edited by ANR Daemon on Tue, 06 Oct 2015, 17:16, edited 1 time in total.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: Работа с реальным временем, туплю…

Postby AlikasS » Tue, 06 Oct 2015, 08:02

Morituruz wrote:Ну раз нажатие кнопки занимает какое-то ощутимое время, то логично вынести его в отдельную задачу/слово, которое будет запускаться в отдельном потоке.
+1
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Работа с реальным временем, туплю…

Postby ANR Daemon » Tue, 06 Oct 2015, 17:11

Morituruz wrote:Ну раз нажатие кнопки занимает какое-то ощутимое время

"Ощутимое" - "больше десятка миллисекунд". Да, в данном случае это было ощутимо.
то логично вынести его в отдельную задачу/слово, которое будет запускаться в отдельном потоке.

Ещё раз - вынос операции в отдельную задачу не решает основной проблемы - смещения времени его выполнения при использовании PAUSE. Снимает остроту - да, но полностью проблемы не убирает.
Выравнивание вызова на границу секунды, пусть даже с 50мс погрешностью, решило проблему.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest