編集:フェルナンドによってninja'd Bawh、:)
わかりましたので、私は私はあなたが欲しいものを言うことができないので、最高の答えはあなたのためになるかについて100%わからないんだけどプログラムは最終的にです。です。
まず第一に、これはスレッドを使用して解決すべき問題ではありません。スレッドは、あらゆるものに対するキャッチオールソリューションではなく、一般に他のソリューションと比較して大きなオーバーヘッドを持っています。既にpthreads
を使用しているので、Windowsの互換性は問題ではないと考えます。
最初の手順では、標準モードを無効にして、enter
を待つことなく文字を取得できるようにします。 stdin
がターミナルではないことを100%確信した場合は、この手順をスキップできます。
#include <iostream>
#include <termios.h>
void toggle_canonical(bool on) {
struct termios terminal_settings;
// Get the existing terminal settings
tcgetattr(0 /* stdin */, &terminal_settings);
if(on) {
// Disable canonical mode
terminal_settings.c_lflag &= ~ICANON;
// Read at least one character.
terminal_settings.c_cc[VMIN] = 1;
} else {
// Enable canonical mode
terminal_settings.c_lflag |= ICANON;
}
tcsetattr(0 /* stdin */, TCSANOW, &terminal_settings);
return;
}
int main(const int argc, const char* argv[]) {
// The read timeout, which can be 0 if you don't want to block at all.
struct timeval to = {5 /* seconds */, 0 /* miliseconds */};
fd_set read_fds;
int ret = 0;
// Turn canonical mode on
toggle_canonical(true);
FD_ZERO(&read_fds);
FD_SET(0, &read_fds);
// The first parameter to select() is the highest file
// descriptor in the set + 1, so in this case because
// STDIN == 0, we pass 1. This is actually completely
// ignored on several platforms, including Windows.
if((ret = select(1, &read_fds /* read set */, NULL /* write set */, NULL /* error set */, &to /* timeout */)) == 0) {
std::cout << "You didn't type anything in time." << std::endl;
} else if (ret == 1) {
std::cout << "Yay, you typed something in time!" << std::endl;
} else if (ret == -1) {
std::cout << "Oh no, an error occured!" << std::endl;
}
// Turn canonical mode off
toggle_canonical(false);
return 0;
}
プログラムはスレッドを実行する前に終了します。 –
なぜそれを修復するのですか? –
スレッドは入力を一度チェックし、何も見つからずに終了します。 –