我正在使用curses库。我希望我的应用程序继续执行,直到按下Escape键。它不应该阻止下一个键输入,
我的工作代码是:这等待用户输入key = getch();我想这是非阻塞,直到有人按ESCAPE KEY。 它不应该等待键盘输入。
while (true)
{
key=getch();
if (key==ESCAPE)
{
break;
}
//else
//{
//execute something
//}
}//while end
答案 0 :(得分:2)
您可以在循环之前调用timeout
函数:
timeout(0);
然后getch
将不再阻止。
该功能的描述是:
void timeout(int delay);
void wtimeout(WINDOW *win, int delay);
超时和wtimeout例程设置阻塞或非阻塞读取 给定的窗口。如果延迟为负,则使用阻塞读取(即, 无限期地等待输入)。如果延迟为零,则为非阻塞 使用read(即,如果没有输入等待,则read返回ERR)。如果延误 为正,然后读取块延迟毫秒,并返回ERR 如果仍然没有输入。因此,这些例程提供了相同的功能 作为nodelay的功能,以及能够的附加功能 仅阻止延迟毫秒(延迟为正)。
答案 1 :(得分:1)
您可以通过设置no delay mode来完成此操作。然后,getch
将无法阻止,并在没有密钥时返回ERR
。
答案 2 :(得分:1)
以下是一个示例:
#include <curses.h>
int
main (void)
{
int c;
initscr ();
noecho ();
timeout (0);
while (1)
{
c = getch ();
if (c != ERR)
{
printw ("%c", c);
}
if (c == 27)
{
break;
}
}
echo ();
endwin ();
return 0;
}
timeout ()
函数告诉阻塞调用在返回之前应该等待多长时间。 0值表示非阻塞,正值x
将在返回前等待x
毫秒。
以下是curses手册页的部分:
timeout和wtimeout例程为给定窗口设置阻塞或非阻塞读取。如果延迟是 使用阻塞读取(即,无限期地等待输入)。如果延迟为零,那么非 使用阻塞读取(即,如果没有输入等待,则读取返回ERR)。如果延迟是积极的,那么 读取延迟毫秒的块,如果仍然没有输入,则返回ERR。因此,这些 tines提供与nodelay相同的功能,以及能够提供的附加功能 阻止仅延迟毫秒(延迟为正)。
答案 3 :(得分:0)
谢谢大家的回复。我用kbhit()
解决了这个问题