2017-01-11 13 views
0

Если мы возьмем очень простой счетчик использования библиотеки:Неблокирующая вход в Gforth

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <ncurses.h> 

int main(void) { 
    struct timespec start; 
    clock_gettime(CLOCK_REALTIME, &start); 
    initscr(); 
    cbreak(); 
    nodelay(stdscr, TRUE); 
    { 
    int key = -1; 
    struct timespec delay, now; 
    do { 
     clock_gettime(CLOCK_REALTIME, &delay); 
     delay.tv_sec = 0; 
     delay.tv_nsec = 1000L * 1000L * 1000L - delay.tv_nsec; 
     nanosleep(&delay, NULL); 
     clock_gettime(CLOCK_REALTIME, &now); 
     mvprintw(1, 1, "%ld\n", (long)(now.tv_sec - start.tv_sec)); 
     refresh(); 
     key = getch(); 
     if (key >= 0) 
     break; 
    } while (now.tv_sec - start.tv_sec < 60); 
    } 
    endwin(); 
    return 0; 
} 

она ликвидирует после нажатия любой клавиши (ОК, из-за cbreak() с помощью Ctrl - C всегда будет работать без любые дополнительные усилия ...).

Но мы можем сделать это более сложным, например, добавить функцию для приостановки счетчика или сброса его на лету (+/- 1 секунду).

Для этого нам определенно нужен неблокирующий ввод клавиатуры.

Интересно, можно ли это сделать в Gforth? Хорошо, я знаю, как ловить прерывания, такие как SIGINT, но что-то вроде выше, для любой ключ или любой предопределенный ключ?

+0

Я удаляю тег C как этот вопрос. ИМО имеет мало общего с C (то есть не будет интересоваться вниманием программистов C). Не стесняйтесь добавлять его обратно, если вы не согласны. – jforberg

ответ

2

Используйте key?, это returns a flag, который является истинным, если доступен новый вход.

Вы можете увеличить следующий код по своему усмотрению, но я думаю, что он объясняет основную идею работы в цикле до нажатия клавиши.

: run-until-key (--) 
    0 
    begin 
     \ place your terminal code here 
     ." Num:" dup . cr 
     1+ 
    key? until drop ; 

Если вы хотите ждать определенного ключа, просто добавьте, если до до:

... 
key? if key 13 = else false then until 
... 

Вы можете также добавить таймер там.