我正在试验 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/