Можно ли установить тайм-аут для std :: cin?

Можно ли установить тайм-аут для std :: cin? Например, std :: cin не получает никаких данных в течение 10 секунд – он выдает исключение или возвращает ошибку.

Отредактировано:

А как насчет таймера из Boost library ? Насколько мне известно, это портативная библиотека. Можно ли запросить таймер библиотеки Boost для исключения исключений через предопределенный период времени? Я думаю, это может решить эту проблему.

Невозможно установить время ожидания для std::cin портативным способом. Даже при использовании не переносных методов это не совсем тривиально: вам нужно будет заменить буфер streamа std::cin .

В системе UNIX я бы заменил буфер streamа по умолчанию, используемый std::cin , на пользовательский, который использует файловый дескриптор 0 для чтения ввода. Чтобы действительно прочитать ввод, я бы использовал poll() для обнаружения присутствия ввода и установки таймаута для этой функции. В зависимости от результата poll() я либо прочитал бы ansible вход, либо потерпел неудачу. Чтобы, возможно, справиться с типизированными символами, которые не перенаправлены в дескриптор файла, однако, может быть разумным также отключить буферизацию, пока не будет введена новая строка.

При использовании нескольких streamов вы можете создать переносимый буфер streamа фильтрации, который использует stream для чтения фактических данных и другого streamа, чтобы использовать временную переменную условия, ожидающую либо для первого streamа, чтобы сигнализировать, что он получил данные, либо для истечения времени ожидания. Обратите внимание, что вам нужно защититься от побочных пробуждений, чтобы убедиться, что таймаут действительно достигнут, когда нет ввода. Это позволило бы избежать использования способа чтения данных из std::cin хотя он по-прежнему заменяет буфер streamа, используемый std::cin чтобы сделать доступными функции через это имя.

Я просто понял, как это сделать, опросив дескриптор файла std :: cin.

функция poll возвращает 0, если время ожидания и событие не произошло, 1 если что-то произошло, и -1, если произошла ошибка.

 #include  #include  #include  #include  #include  #include  bool stop = false; void intHandler(int dummy) { stop = true; } std::string readStdIn() { struct pollfd pfd = { STDIN_FILENO, POLLIN, 0 }; std::string line; int ret = 0; while(ret == 0) { ret = poll(&pfd, 1, 1000); // timeout of 1000ms if(ret == 1) // there is something to read { std::getline(std::cin, line); } else if(ret == -1) { std::cout << "Error: " << strerror(errno) << std::endl; } } return line; } int main(int argc, char * argv[]) { signal(SIGINT, intHandler); signal(SIGKILL, intHandler); while(!stop) { std::string line = readStdIn(); std::cout << "Read: " << line << std::endl; } std::cout << "gracefully shutdown" << std::endl; } в #include  #include  #include  #include  #include  #include  bool stop = false; void intHandler(int dummy) { stop = true; } std::string readStdIn() { struct pollfd pfd = { STDIN_FILENO, POLLIN, 0 }; std::string line; int ret = 0; while(ret == 0) { ret = poll(&pfd, 1, 1000); // timeout of 1000ms if(ret == 1) // there is something to read { std::getline(std::cin, line); } else if(ret == -1) { std::cout << "Error: " << strerror(errno) << std::endl; } } return line; } int main(int argc, char * argv[]) { signal(SIGINT, intHandler); signal(SIGKILL, intHandler); while(!stop) { std::string line = readStdIn(); std::cout << "Read: " << line << std::endl; } std::cout << "gracefully shutdown" << std::endl; } 
Давайте будем гением компьютера.