2

我正在使用诅咒库。我希望我的应用程序继续执行,直到按下 Escape 键。它不应该阻止下一个键输入,

我的工作代码是:这等待用户输入 key=getch(); 我希望这是非阻塞的,直到有人按下 ESCAPE KEY。它不应该等待键盘输入。

while (true)
{
    key=getch();
    if (key==ESCAPE)
    {
        break;
    }
    //else
    //{
        //execute something 
    //}
}//while end
4

4 回答 4

2

您可以timeout在循环之前调用这样的函数:

timeout(0);

然后getch不会再阻塞了。

该函数的描述是:

void timeout(int delay);
void wtimeout(WINDOW *win, int delay);

timeout 和 wtimeout 例程为给定窗口设置阻塞或非阻塞读取。如果延迟为负,则使用阻塞读取(即无限期地等待输入)。如果延迟为零,则使用非阻塞读取(即,如果没有输入等待,则读取返回 ERR)。如果延迟为正,则读取延迟毫秒的块,如果仍然没有输入,则返回 ERR。因此,这些例程提供与 nodelay 相同的功能,以及能够仅延迟毫秒(其中延迟为正)阻塞的附加功能。

于 2012-06-01T08:27:29.817 回答
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。因此,这些例程提供了与 nodelay 相同的功能,以及能够阻塞仅延迟毫秒(其中延迟为正)的附加功能。

于 2012-06-01T08:31:25.437 回答
1

您可以通过设置无延迟模式来做到这一点。thengetch不会阻塞,ERR在没有 key 的时候返回。

于 2012-06-01T08:22:04.160 回答
0

谢谢大家的回复。我使用 kbhit() 解决了这个问题

于 2012-06-01T11:00:04.953 回答