我使用CreateProcess
从Win32生成一个进程,将STARTUPINFO
的hStdOutput
和hStdError
属性设置为用CreatePipe
创build的pipe道句柄。 我有两个线程读取pipe道,等待数据变为可用(或者进程完成,在此之前它检查在终止线程之前没有剩下数据)。
随着数据变得可用,我将输出写入一个有效的大文本框。
发生什么事是输出被缓冲,所以一个缓慢运行的过程只是获取文本框中的大块数据,而不是“正好发生”。
我不确定是否是进行缓冲的pipe道,或者与redirect有关。
有什么办法可以将pipe道设置为无缓冲的,或者以尽可能快的方式发送标准输出来启动进程?
我正在testing一个testing应用程序,相隔一秒打印行
Here is line one (waits one second) Here is line two (waits one second) ... etc
缓冲可能在C运行时(printf等),并没有太多可以做的(IIRC它做了一个isatty()检查来确定一个缓冲策略)
有SetNamedPipeHandleState ,但它只控制远程管道的缓冲,而不是两端在同一台计算机上。
在我看来,如果将STARTUPINFO
的hStdOutput
和hStdError
设置为使用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
hStdOutput
和hStdError
。