特定の時間内に入力がない場合、ユーザー入力の呼び出しを効果的にキャンセルするにはどうすればよいですか? (Mac OS X でターミナル/コマンド ウィンドウ用のゲームをプログラミングしています)。
標準バッファリングをオフにして、ユーザー入力の呼び出し後に参加するタイマー スレッドを使用しようとしました。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;
}