Deshabilitar el almacenamiento en búfer en el redireccionado stdout Pipe (Win32 API, C ++)

Estoy generando un proceso de Win32 usando CreateProcess , estableciendo las propiedades hStdOutput y hStdError de STARTUPINFO en los identificadores de las tuberías creados con CreatePipe . Tengo dos hilos que leen los tubos, esperando que los datos estén disponibles (o el proceso para completar, en cuyo punto comprueba que no quedan datos antes de terminar el hilo).
A medida que los datos están disponibles, escribo el resultado de manera efectiva en un gran cuadro de texto.

Lo que está sucediendo es que el resultado se está almacenando en el búfer, por lo que un proceso de ejecución lenta simplemente genera fragmentos de datos en el cuadro de texto, pero no “como sucede”.

No estoy seguro de si es la tubería que está haciendo el almacenamiento en búfer, o algo que ver con la redirección.

¿Hay alguna forma de configurar el tubo que se va a liberar, o iniciar el proceso de tal manera que el stdout se envíe lo antes posible?

Estoy probando con una aplicación de prueba que imprime líneas con un segundo de diferencia

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

El almacenamiento en búfer está probablemente en el tiempo de ejecución de C (printf, etc.) y no hay mucho que pueda hacer al respecto (IIRC hace una comprobación isatty () para determinar una estrategia de almacenamiento en búfer)

Hay SetNamedPipeHandleState , pero solo controla el almacenamiento en búfer de las canalizaciones remotas, no cuando ambos extremos están en la misma computadora.

Me parece que puedes resolver el problema si estableces hStdOutput y hStdError de STARTUPINFO no en los identificadores de las tuberías creados con CreatePipe , sino que creas uno llamado pipes (con la función CallNamedPipe exactamente igual que si también hubieras utilizado SECURITY_ATTRIBUTES con bInheritHandle = TRUE , consulte http://msdn.microsoft.com/en-us/library/aa365782.aspx ) y luego abrir allí por su nombre con respecto a FILE_FLAG_WRITE_THROUGH utilizando el indicador FILE_FLAG_WRITE_THROUGH . Al igual que puede leer en MSDN ( http://msdn.microsoft.com/en-us/library/aa365592.aspx ):

El cliente de canalización puede usar CreateFile para habilitar el modo superpuesto especificando FILE_FLAG_OVERLAPPED o para habilitar el modo de escritura directa especificando FILE_FLAG_WRITE_THROUGH.

Así que solo vuelva a abrir el conducto con respecto a FILE_FLAG_WRITE_THROUGH usando el indicador FILE_FLAG_WRITE_THROUGH y establezca los identificadores / identificadores en hStdOutput y hStdError de STARTUPINFO .