Отключить буферизацию на перенаправленном стандартном канале (Win32 API, C ++) - PullRequest
13 голосов
/ 02 августа 2010

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 02 августа 2010

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

0 голосов
/ 02 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...