我正在用 C 语言编写一个程序,它使用 ncurses 来检查是否按下了某个键。问题是按键重复有延迟。
例如,如果我在终端中按住“a”键,则在重复输入“a”之前会有短暂的延迟。我希望能够知道它是否是从实际按下的位置按下的。
在终端中如何暂时将此延迟更改为 0?我目前使用的是 Mac OSX 10.10.5。
对于 ncurses(任何curses 实现),您可以使用getch而不是getchar。后者是C标准I/O输入函数。
有人建议使用 ncurses 创建一个函数来检查 unix 中的按键情况,其中包含一个值得一提的答案。它用nodelay以消除通常花在getch
对于转义序列的连续字节。在诅咒中,你总是在等待与不等待之间进行权衡,因为转义序列可能不会一次性到达read
手术。此处显示的示例报告没有可用角色的情况,并在这种情况下暂停(休眠)一小段时间。
如果您只想查看读取的字符,您可以消除该暂停(但会使您的程序使用大量 CPU 时间):
#include <ncurses.h>
int kbhit(void)
{
int ch = getch();
if (ch != ERR) {
ungetch(ch);
return 1;
} else {
return 0;
}
}
int main(void)
{
initscr();
cbreak();
noecho();
nodelay(stdscr, TRUE);
scrollok(stdscr, TRUE);
while (1) {
if (kbhit()) {
printw("Key pressed! It was: %d\n", getch());
}
}
}
或者(认识到存在权衡),使用napms暂停short时间量,但减少使用的 CPU 时间:
#include <ncurses.h>
int kbhit(void)
{
int ch = getch();
if (ch != ERR) {
ungetch(ch);
return 1;
} else {
return 0;
}
}
int main(void)
{
initscr();
cbreak();
noecho();
nodelay(stdscr, TRUE);
scrollok(stdscr, TRUE);
while (1) {
if (kbhit()) {
printw("Key pressed! It was: %d\n", getch());
} else {
napms(20);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)