Отключить буферизацию при перенаправлении stdout Pipe (Win32 API, С++)

Я запускаю процесс из Win32 с помощью CreateProcess, устанавливая свойства hStdOutput и hStdError STARTUPINFO для дескрипторов труб, созданных с помощью CreatePipe. У меня есть два потока, которые читают трубы, ожидая, когда данные станут доступными (или процесс будет завершен, и в этот момент он проверяет, что перед завершением потока нет данных).
По мере того, как данные становятся доступными, я пишу вывод для эффективного большого текстового поля.

Что происходит, результат буферизуется, поэтому процесс медленного запуска просто получает куски данных, брошенных в текстовое поле, но не "как это бывает".

Я не уверен, что это труба, которая выполняет буферизацию или что-то делать с перенаправлением.

Есть ли способ установить, что труба небуферизирована, или запустить процесс таким образом, чтобы сообщение stdout было отправлено как можно скорее?

Я тестирую тестовое приложение, которое печатает строки на одну секунду.

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

Ответ 1

Буферизация, вероятно, находится во время выполнения C (printf и т.д.), и вы не можете с этим справиться (IIRC он выполняет проверку isatty() для определения стратегии буферизации)

Ответ 2

Там SetNamedPipeHandleState, но он управляет только буферизацией для удаленных труб, а не когда оба конца находятся на одном компьютере.

Ответ 3

Мне кажется, что вы можете решить проблему, если вы установите hStdOutput и hStdError в STARTUPINFO not для дескрипторов труб, созданных с помощью CreatePipe, но вместо этого вы создаете именованные каналы (с функцией CallNamedPipe точно так же, как вы использовали, если раньше также использовались SECURITY_ATTRIBUTES с bInheritHandle= TRUE, см. http://msdn.microsoft.com/en-us/library/aa365782.aspx), а затем откройте его по имени CreateFile, используя флаг FILE_FLAG_WRITE_THROUGH. Как вы можете прочитать на MSDN (http://msdn.microsoft.com/en-us/library/aa365592.aspx):

Клиент канала может использовать CreateFile для включить режим перекрытия, указав FILE_FLAG_OVERLAPPED или включить режим записи, указав FILE_FLAG_WRITE_THROUGH.

Поэтому просто заново откройте трубу по CreateFile с помощью флага FILE_FLAG_WRITE_THROUGH и установите дескриптор/дескриптор в hStdOutput и hStdError из STARTUPINFO.