取消对用户输入C++的调用



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

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

如果我能在不摆弄下载和安装 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;
}

看看这是否有效!

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 中获取关键字符。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新