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;
}

任意のキーを押すと中止されます(OK、cbreak()使用しているため、特別ctrlC努力なしで常に機能します...)。

ただし、カウンターを一時停止する関数を追加したり、オンザフライでリセットしたり (+/- 1 秒) するなど、これをより複雑にすることができます。

これには、ノンブロッキングのキーボード入力が絶対に必要です。

Gforthでこれを行うことは可能でしょうか? OK、そこで SIGINT のような割り込みをキャッチする方法は知っていますが、上記のようなものは、任意のキーまたは任意の所定のキーに対して機能しますか?

4

1 に答える 1