Я пытаюсь сделать что-то, что, по моему мнению, должно быть простым: сделать блокировку прочитанной со стандартного ввода, но тайм-аут после определенного интервала, если нет данных.
В мире Unix это было бы просто с select(), но это не работает в Windows, потому что stdin не является сокетом. Какая следующая простейшая опция без создания дополнительных потоков и т.д.
Я использую визуальный С++, предназначенный для среды Win32.
до сих пор я пробовал:
-
с помощью select (не работает, если вход не является сокетом)
-
с помощью WaitForSingleObject (GetStdHandle (STD_INPUT_HANDLE)). - Первое предложение Рэми. Кажется, что это всегда возвращается сразу, когда вы вызываете его, если стандартный ввод является консолью (другие сообщили о той же проблеме)
-
с использованием перекрытого ввода-вывода и выполнения WaitForSingleObject (remy third suggestion). В этом случае чтение всегда кажется заблокированным, когда вход поступает с консоли - кажется, что stdin не поддерживает асинхронный ввод-вывод.
В настоящий момент я думаю, что моя единственная оставшаяся опция - создать поток, который будет читать блокировку, а затем сигнализировать о событии, а затем еще один поток, ожидающий события с таймаутом.