如何从Windows中的多个管道读取同一个线程

时间:2011-03-14 11:34:28

标签: c++ c winapi pipe

在我的程序中,我有几个管道连接到stdout和stderr子进程流(即在主要进程中我正在从这些流中读取)。但是,如果没有任何东西可以从其中一个中读取,我的程序就会挂起。有没有办法解决这个问题不使用线程。此外,如果在x msecs期间无法阅读,我希望所有子进程都被杀死。

在unix select()+ non_blocking中解决了这两个问题。但是窗户怎么样?

2 个答案:

答案 0 :(得分:6)

您可以在Windows中使用类似的方法。使用OVERLAPPED结构,您可以对管道发出异步I / O.然后在关联的事件句柄上使用WaitForMultipleObjects并超时(这是选择模拟)。有关选项的概述,请参阅this

答案 1 :(得分:1)

如果“挂起”你的意思是你的GUI应用程序停止响应,我认为你正在寻找MsgWaitForMultipleObjects,它将让你的GUI泵消息,同时等待最多31个句柄发出信号。

将它与OVERLAPPED IO组合以实际将读取完成事件转换为等待信号(您无法直接将文件句柄传递给任何WaitForXXX函数)。

如果您需要一次等待超过~30个读取事件,那么您将需要使用工作线程,以及可能的IO完成端口。