1

如果在一定时间内没有输入,我将如何有效地取消对用户输入的调用?(我正在使用 Mac OS X 为终端/cmd 窗口编写游戏)。

我尝试关闭规范缓冲并使用在调用用户输入后加入的计时器线程。我还尝试pthread_join()在 while 循环的参数中实现对的调用。依然没有。问题是即使规范缓冲关闭,当没有输入时,对用户输入的调用仍然被阻止。如果有输入,它工作正常。

如果我能做到这一点而不需要摆弄下载和安装 ncurses,那就太好了,但如果我必须这样做,我会这样做。

编辑:源代码:

//Most headers only pertain to my main program. 
#include <iostream>
#include <termios.h>
#include <pthread.h>
#include <time.h>
#include <cstring>
#include <stdio.h>
#include <string.h>

using namespace std;

//Timer function.
void *Timer(void*) {

    time_t time1, time2;

    time1 = time(NULL);

    while (time2 - time1 < 1) {
        time2 = time(NULL);
    }

    pthread_exit(NULL);
}

int main() {

    //Remove canonical buffering.
    struct termios t_old, t_new;
    tcgetattr(STDIN_FILENO, &t_old);
    t_new = t_old;
    t_new.c_lflag &= ~ICANON;
    tcsetattr(STDIN_FILENO, TCSANOW, &t_new);

    cout << "Press any key to continue." << endl;

    string szInput;

    int control = 0;

    do {

        pthread_t inputTimer;

        pthread_create(&inputTimer, NULL, Timer, NULL);

        szInput = "";

        while (szInput == "") {

            szInput = cin.get();


            //Handle keypresses instantly.
            if (szInput == "a") {
                cout << endl << "Instant keypress." << endl;
            }
        }    

        pthread_join(inputTimer, NULL); 

        cout << endl << "One second interval." << endl;

        control ++;

    } while (control < 25);

    cout << "Game Over." << endl;

    return 0;

}
4

3 回答 3

1

看看这是否有效!

char ch;  //Input character
int time = 0;     //Time iterator
int TIMER = 5000; //5 seconds
while(time<TIMER)
{
    if(!kbhit())
    {
        time = 0;
        ch = getch();
        //Do your processing on keypress
    }
    time++;
    delay(1);
}

kbhit()检测是否发生了任何击键。如果是,则获取 中的关键字符ch

于 2012-08-16T07:23:37.003 回答
0

STDIN_FILENO检查是否有输入的一种方法是使用例如select系统调用来轮询文件描述符。如果STDIN_FILENO是可读的,那么您至少可以读取一个字符。您还可以将超时传递给select调用。

于 2012-08-16T20:15:29.290 回答
0

感谢 Shashwat,它适用于以下修改:

1) 更改if(!kbhit())if(kbhit())

2) 更改delay(1);Sleep(1);

我没有足够的代表发表评论,因此添加为答案。

于 2014-02-20T09:29:53.043 回答