【发布时间】:2013-11-26 03:54:15
【问题描述】:
我正在尝试做一些我认为应该很简单的事情:从标准输入进行阻塞读取,但如果没有数据可用,则会在指定的时间间隔后超时。
在 Unix 世界中,使用 select() 会很简单,但在 Windows 中却不行,因为 stdin 不是套接字。在不创建额外线程等的情况下,下一个最简单的选项是什么?
我正在使用针对 Win32 环境的 Visual C++。
到目前为止我已经尝试过:
使用
select(如果输入不是套接字则不起作用)使用
WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE))。 - 雷米的第一个建议。如果标准输入是控制台,这似乎总是在您调用它时立即返回(其他人报告了同样的问题)使用重叠 IO 并执行
WaitForSingleObject(Remy 的第三个建议)。在这种情况下,当输入来自控制台时,读取似乎总是阻塞 - 似乎stdin不支持异步 I/O。
目前我在想我唯一剩下的选择是创建一个线程来执行阻塞读取,然后发出一个事件信号,然后让另一个线程超时等待事件。
【问题讨论】:
-
您很好地解释了您的问题,但您对此做了什么尝试?
-
如果您正确地从 STD_INPUT_HANDLE 中删除初始事件,则使用 WaitForSingleObject() 进行的 #2 尝试会奏效。就我而言,我从一开始就在控制台队列中有一个“焦点”事件。看看@Clay 的回答,没错。