2011-03-14 64 views
1

在我的程序中,我有连接到子进程的stdout和stderr流的saveral管道(即在我正在读取这个流的主进程中)。但是当它们中的一个没有任何可读的时候,我的程序就会挂起。有没有办法解决这个问题,而不是使用线程。另外,我希望在x msecs期间没有任何可读的内容会导致所有子进程被终止。在同一线程中如何从Windows中的多个管道读取

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

回答

6

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

1

如果“挂起”你的意思是你的GUI应用程序停止响应,我认为你正在寻找MsgWaitForMultipleObjects,这将让你的GUI泵信息,而等待多达31个手柄信号。

将它与OVERLAPPED IO结合起来,实际上将读取完成事件转换为可等待的信号(您不能直接将文件句柄传递给任何WaitForXXX函数)。

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