c - 为什么 getch() 在以非常短的延迟调用 halfdelay() 之后读取 EOF?

标签 c ncurses

我正在试验 ncurses,在使用 halfdelay 时,我偶然发现了一些有小延迟的反直觉行为。

以下内容需要用户的键盘输入。我不只是按下和释放一个键,而是在按下键的情况下对其进行测试,以便它应该继续打印相应的字符(更准确地说,是相应的 int 值)。这是我所拥有内容的精简版本:

#include <ncurses.h>

int main() {
  int c = 0, d = 0, e = 0;

  initscr();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);

  while ('q' != (c = getch())) {
    printw("c: %d\n", c);

    // Make sure that halfdelay returned OK. It should as the input is in the expected range ([1, 255])
    if ((d = halfdelay(1)) != OK) {
      printw("d: %d\n", d);
      return 0;
    }

    e = getch();

    printw("e: %d\n", e);
    cbreak();
  }

  endwin();
  return 0;
}

以下是我构建和运行它的方式:

$ gcc -Wall -Wpedantic -lncurses file.c
$ a.out

以及运行时的输出(在键盘上按住 a ~1 秒后):

c: 97
e: -1
c: 97
e: 97
c: 97
e: 97
c: 97
e: 97
c: 97
e: 97
c: 97
e: 97
c: 97
e: -1

问题 此输出中的 -1/EOF 来自哪里?我确实注意到通过增加延迟(在我的机器上从 1 到 7)使 EOF 字符完全消失。我很想了解造成这种情况的机制是什么。

最佳答案

tl;博士 如果您输入的速度太慢,您将无法使用 getch 获得 key ,而是获得 EOF

长版:

根据 ncurses 手册,halfdelay 模式意味着输入功能会等待,直到按下某个键或给定的超时间隔到期。 使用 halfdelay(1),您不仅可以将输入模式设置为 halfdelay,还可以将此间隔设置为 1/10 秒。 这意味着如果您没有在 1/10 秒内获得 key ,该函数无论如何都会返回。

另一方面,按住一个键会创建多个按键。如果这些按键的速度太慢而无法适应您的半延迟间隔,您有时会用完按键,并且会看到 EOF

因此,如果您将间隔增加到超过按键间隔,则可以避免得到EOF,这是很直接的。

要验证数字,您可以尝试弄清楚按住某个键的键重复率是多少。每秒可能少于 7 个。

关于c - 为什么 getch() 在以非常短的延迟调用 halfdelay() 之后读取 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50875570/

相关文章:

python - Curses(Python)中两种颜色之间的淡入淡出

c - GCC 未按预期在 Ubuntu 中编译 C 代码

c - 用20MHz晶振在C中做延时(初级)

rust - 仅匹配有效的 UTF-8 字符

c - 即使导出 NCURSES_NO_UTF8_ACS=1,ACS 字符也无法在腻子中工作

c++ - 进度条 ncurses

c - 从输出中排除用户的输入值

c - 如何编写比特流

使用 open() 写入之前清除文件

c - C 中的 ncurses 打印的内容超出应有的内容并打印颜色代码