如果在一定时间内没有输入,我将如何有效地取消对用户输入的调用?(我正在使用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);
我没有足够的代表发表评论,因此添加为答案。