如何对用户输入设置时间限制?

时间:2012-03-05 23:57:02

标签: c++ user-input

我已尝试使用输入和我的一秒计时器的各种设置,但没有任何工作。当到达要求输入的部分时,整个代码停止。我有一个无缓冲的流,所以我不需要按回车发送输入。此外,这个目的是为了我正在设计终端使用的pac-man游戏。我想要的基本上是有一秒间隔,用户可以输入命令。如果没有输入命令,我希望pac-man继续移动上次输入命令时移动的方向。

编辑:

time_t startTime, curTime;

    time(&startTime);
    do
    {
        input=getchar();
        time(&curTime);
    } while((curTime - startTime) < 1);

4 个答案:

答案 0 :(得分:2)

您可以尝试使用alarm()(或类似的计时器功能)来抛出并让您的应用程序捕获SIGALRM,尽管这对于PacMac来说肯定是有点过分。考虑使用单独的线程(POSIX线程)来控制计时器。

答案 1 :(得分:1)

在Unix上,您可以在标准输入文件描述符(STDIN_FILENO或fileno(stdin))上使用select或poll并超时。我不会为此引入由信号和线程构成的鼠标陷阱。

答案 2 :(得分:0)

您可以使用非阻塞输入函数,例如getch(),但它不是非常跨平台兼容。

理想情况下,您应该使用事件来更新游戏状态,具体取决于您所针对的操作系统,您可以使用操作系统事件进行按键操作,也可以使用SDL等库。

答案 3 :(得分:0)

我的直觉告诉了我:

  • 让一个线程专门处理用户输入并将关键事件放入队列
  • 在每次激活时,计时器激活的线程使用在线程激活时最后发生的事件消耗队列中的所有关键事件。

确保您对队列的访问是同步的。

// I/O Thread:
while (!stop) {
    input = getchar();
    lock_queue();
    queue.push_back(input);
    unlock_queue();
}

// Timer Thread:
while (!stop) {
    lock_queue();
    if (queue.size() == 0) {
        action = DEFAULT_ACTION;
    } else {
        // either handle multiple key events somehow
        // or use the last key event:
        action = queue.back();
        queue.clear();
    }
    unlock_queue();
    perform_action(action);
    sleep();
}

完整示例发布为Github Gist