【问题标题】:C++ How to wait for keyboard input for a limited timeC ++如何在有限的时间内等待键盘输入
【发布时间】:2015-12-13 08:29:19
【问题描述】:

我希望我的控制台应用程序停止并等待用户按键。如果在有限的时间后没有键盘输入,假设 2 秒,执行应该恢复。

我知道没有解决方案可以在所有实现中移植,但至少有简单的解决方案吗?

this onethis one 之类的一些帖子处理类似问题,但它们似乎没有为该特定问题提供答案。

如果我可以使用 ncurses(我不能),我会使用 getch()timeout() 函数做这样的事情:

#include <ncurses.h>
int main()
{
    initscr();          // Start curses mode
    cbreak();           // Turn off line buffering
    timeout(2000);      // Wait 2000 ms for user input
    while (true) {
        addstr("You have 2 sec. to press 'q', otherwise ...\n");
        refresh();
        int inKey = getch();
        if (inKey == 'q') break;
    }
    endwin();
    return 0;
}

【问题讨论】:

标签: c++ keyboard ncurses


【解决方案1】:

这样做的一种方法是使用低级 read()(假设您在 Posix 上)与超时信号结合使用。由于 read() 将在信号处理后以 EINTR 退出,因此您会知道您已达到超时。

【讨论】:

  • 好的,谢谢,我会调查的。这意味着该解决方案至少可以在符合 POSIX 的系统上运行。
  • 低级读取加上 STDIN 句柄上的 poll() 或 select(),超时参数不是无穷大?
  • @cardiffspaceman,民意调查/选择通常不适用于标准输入,因为它被认为是“立即可用”并且民意调查总是返回可以读取描述符。
  • @SergeyA 在我的测试中它有效。这是我在一些休闲程序中使用过的,因为我习惯于使用 poll() 来检测生产代码中的输入,其中 I/O 略有不同,例如套接字和字符驱动程序。您的回答当然可以很好地处理 OP 的迫切需求。
  • @cardiffspaceman,套接字和字符驱动程序不是文件,所以这是不同的。话虽如此,我完全相信您可以在您的系统上对标准输入进行轮询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多