I'm spawning a process from Win32 using CreateProcess
, setting the hStdOutput
and hStdError
properties of STARTUPINFO
to pipe handles created with CreatePipe
. I've got two threads reading the pipes, waiting for data to become available (or the process to complete, at which point it checks that there is no data left before terminating the thread).
As data becomes available, I write the output out to effectively a big textbox.
What's happening is the output is being buffered, so a slow running process just gets chunks of data thrown at the text box, but not "as it happens".
I'm not sure if it's the pipe that's doing the buffering, or something to do with the redirection.
Is there any way to either set the pipe to be unbuffered, or start the process in such a way that the stdout is sent as soon as possible?
I'm testing with a test app that prints lines one second apart
Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
The buffering is probably in the C runtime (printf etc) and there is not much you can do about it (IIRC it does a isatty() check to determine a buffering strategy)
There's SetNamedPipeHandleState, but it only controls buffering for remote pipes, not when both ends are on the same computer.
It seems to me you can solve the problem if you set the hStdOutput
and hStdError
of STARTUPINFO
not to pipe handles created with CreatePipe
, but instead of that you create a named pipes (with CallNamedPipe
function exactly like you used if before also using SECURITY_ATTRIBUTES with bInheritHandle
= TRUE
, see http://msdn.microsoft.com/en-us/library/aa365782.aspx) and then open there by name with respect of CreateFile
using FILE_FLAG_WRITE_THROUGH
flag. Like you can read on the MSDN (http://msdn.microsoft.com/en-us/library/aa365592.aspx):
The pipe client can use CreateFile to
enable overlapped mode by specifying
FILE_FLAG_OVERLAPPED or to enable
write-through mode by specifying
FILE_FLAG_WRITE_THROUGH.
So just reopen the pipe with respect of CreateFile
using FILE_FLAG_WRITE_THROUGH
flag and set the handle/handles to hStdOutput
and hStdError
of STARTUPINFO
.