禁用缓冲redirect标准输出pipe道(Win32 API,C ++)

我使用CreateProcess从Win32生成一个进程,将STARTUPINFOhStdOutputhStdError属性设置为用CreatePipe创build的pipe道句柄。 我有两个线程读取pipe道,等待数据变为可用(或者进程完成,在此之前它检查在终止线程之前没有剩下数据)。
随着数据变得可用,我将输出写入一个有效的大文本框。

发生什么事是输出被缓冲,所以一个缓慢运行的过程只是获取文本框中的大块数据,而不是“正好发生”。

我不确定是否是进行缓冲的pipe道,或者与redirect有关。

有什么办法可以将pipe道设置为无缓冲的,或者以尽可能快的方式发送标准输出来启动进程?

我正在testing一个testing应用程序,相隔一秒打印行

 Here is line one (waits one second) Here is line two (waits one second) ... etc 

Solutions Collecting From Web of "禁用缓冲redirect标准输出pipe道(Win32 API,C ++)"

缓冲可能在C运行时(printf等),并没有太多可以做的(IIRC它做了一个isatty()检查来确定一个缓冲策略)

有SetNamedPipeHandleState ,但它只控制远程管道的缓冲,而不是两端在同一台计算机上。

在我看来,如果将STARTUPINFOhStdOutputhStdError设置为使用hStdOutput创建的管道句柄,而不是创建一个命名管道(使用CallNamedPipe函数,就像之前在使用bInheritHandle使用SECURITY_ATTRIBUTES一样= TRUE ,请参阅http://msdn.microsoft.com/en-us/library/aa365782.aspx ),然后使用FILE_FLAG_WRITE_THROUGH标志通过名称关于CreateFile在那里打开。 就像你可以阅读MSDN( http://msdn.microsoft.com/en-us/library/aa365592.aspx ):

管道客户端可以使用CreateFile通过指定FILE_FLAG_OVERLAPPED来启用重叠模式,或者通过指定FILE_FLAG_WRITE_THROUGH来启用直写模式。

因此,只需使用FILE_FLAG_WRITE_THROUGH标志重新打开CreateFile的管道,并将句柄/句柄设置为STARTUPINFO hStdOutputhStdError