Отключите буферизацию на перенаправленном Канале stdout (Win32 API, C++)

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

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

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

Там какой-либо путь состоит в том, чтобы или установить канал, который будет освобожден буфер или запустить процесс таким способом, которым stdout отправляется как можно скорее?

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

Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
14
задан Alexander Farber 25 November 2014 в 10:20
поделиться

3 ответа

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

4
ответ дан 1 December 2019 в 16:39
поделиться

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

1
ответ дан 1 December 2019 в 16:39
поделиться

Мне кажется, вы можете решить проблему, если установите 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 .

0
ответ дан 1 December 2019 в 16:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: