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

取消用户输入C++的调用,c++,timer,user-input,C++,Timer,User Input,如果在特定时间内没有输入,我如何有效地取消用户输入呼叫?我正在用MacOSX为终端/cmd窗口编程一个游戏 我已经尝试过关闭规范缓冲,并使用在调用用户输入后加入的计时器线程。我还尝试在while循环的参数中实现对pthread_join的调用。还是没什么。问题是,即使规范缓冲已关闭,当没有输入时,对用户输入的调用仍会被挂起。但是,如果有输入,它就可以正常工作 如果我能做到这一点而不必费心下载和安装ncurses,那就太好了,但如果有必要,我会这么做 编辑:源代码: //Most headers

如果在特定时间内没有输入,我如何有效地取消用户输入呼叫?我正在用MacOSX为终端/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检测是否发生了任何击键。如果是,则获取通道中的关键字符。

看看这是否有效

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检测是否发生了任何击键。如果是,则获取通道中的关键字符。

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

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

谢谢Shashwat,它可以通过以下修改工作:

1如果有,请更改!kbhit到ifkbhit

2.1;睡觉1


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

谢谢Shashwat,它可以通过以下修改工作:

1如果有,请更改!kbhit到ifkbhit

2.1;睡觉1


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

您如何阅读用户的输入?使用流,例如cin、stdio,例如scanf/fgets/fgetc或系统调用,例如read?如果你能展示一些最小的和相关的代码,这会有所帮助。虽然你仍然不知道你使用的是什么输入方法,但你真的应该关闭所有的缓冲。或者使用一些轮询技术,比如使用select来查看是否可以读取STDIN_文件号。@JoachimPileborg:多亏了你的第二个建议,我才能够解决我的问题。如果你做一个正式的回答,我会接受。你是如何阅读用户的输入的?使用流,例如cin、stdio,例如scanf/fgets/fgetc或系统调用,例如read?如果你能展示一些最小的和相关的代码,这会有所帮助。虽然你仍然不知道你使用的是什么输入方法,但你真的应该关闭所有的缓冲。或者使用一些轮询技术,比如使用select来查看是否可以读取STDIN_文件号。@JoachimPileborg:多亏了你的第二个建议,我才能够解决我的问题。如果您做出正式答复,我将接受。因为我目前无法访问我的Windows计算机。因为我目前无法访问我的Windows计算机。