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