退出键按下C中的无限循环

时间:2012-06-01 08:15:19

标签: c infinite-loop ncurses

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

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

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

4 个答案:

答案 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()

解决了这个问题