1

如果我们使用 ncurses 做一个非常简单的计数器:

#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 这样的中断,但是像上面那样,为任何键或任何预定键工作?

4

1 回答 1

4

使用key?,它返回一个标志,如果新输入可用,则该标志为真。

您可以根据需要扩充以下代码,但我认为它解释了在循环中运行直到按下键的基本思想。

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

如果你想等待一个特定的键,只需在 until 之前添加一个 if:

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

你也可以在那里添加你的计时器。

于 2017-01-23T16:18:18.640 回答