Ответ 1
Буферизация, вероятно, находится во время выполнения C (printf и т.д.), и вы не можете с этим справиться (IIRC он выполняет проверку isatty() для определения стратегии буферизации)
Я запускаю процесс из 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
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
.