Я порождаю процесс от использования Win32 CreateProcess
, установка hStdOutput
и hStdError
свойства STARTUPINFO
передавать по каналу дескрипторы, созданные с CreatePipe
. У меня есть два потока, читая каналы, ожидая данных для становления доступным (или процесс для завершения, в которой точке это проверяет, что нет никаких данных, оставленных прежде, чем завершить поток).
Поскольку данные становятся доступными, я выписываю вывод к эффективно большому текстовому полю.
То, что происходит, является выводом, буферизуется, таким образом, медленный рабочий процесс просто бросил блоки данных в текстовом поле, но не, "как это происходит".
Я не уверен, является ли это канал, это делает буферизацию или что-то, чтобы сделать с перенаправлением.
Там какой-либо путь состоит в том, чтобы или установить канал, который будет освобожден буфер или запустить процесс таким способом, которым stdout отправляется как можно скорее?
Я тестирую с тестовым приложением, которое печатает строки одна секунда независимо
Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
Буферизация, вероятно, выполняется во время выполнения C (printf и т. Д.), И вы мало что можете с этим поделать (IIRC выполняет проверку isatty () для определения стратегии буферизации)
Есть SetNamedPipeHandleState , но он управляет буферизацией только для удаленных каналов, а не когда оба конца находятся на одном компьютере.
Мне кажется, вы можете решить проблему, если установите hStdOutput
и hStdError
из STARTUPINFO
, а не , чтобы передать дескрипторы, созданные с помощью ] 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
.