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