powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Синхронное чтение вывода процесса
33 сообщений из 33, показаны все 2 страниц
Синхронное чтение вывода процесса
    #39390220
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня всем!!!

есть консольное приложение (не моё), выводящее текст
как можно организовать его "фриз" пока я не дам ему буфер для вывода?
т.е. организовать что-то вроде

Код: plaintext
1.
2.
цикл:
  чтение буфера (здесь внешнее приложение должно работать, ждём вывода в буфер)
  какая-то моя обработка (здесь оно должно "зависнуть", пока не дам ему буфер на следующем цикле)


PS: про пайпы в курсе
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390221
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё только для WinAPI
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390240
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри SuspendThread() / ResumeThread()

Если прога однопоточная, то хэндл потока вернет CreateProcess(), если многопоточная то поизвращаться придется.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390250
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

спасибо, но нужно ловить его именно на IO, как самом безопасном месте
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390271
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)нужно ловить его именно на IO, как самом безопасном месте
Ничего не понял. Тебе еще момент остановки надо как-то определить?

Вопрос был
kealon(Ruslan)как можно организовать его "фриз" пока я не дам ему буфер для вывода?
Сделай буфер с запасом и тормози как осталось меньше какого-то минимума.

Пайпы чем не устроили? Как консоль читаешь?
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390278
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

через пайпы и читаю, дело в том что размер буфера для пайпа довольно большой
MSDNnSize [in]
The size of the buffer for the pipe, in bytes. The size is only a suggestion; the system uses the value to calculate an appropriate buffering mechanism.
и пока он не заполнится процесс не стопорится.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390382
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)и пока он не заполнится процесс не стопорится.
Опять ничего не понимаю. Зачем тебе ждать заполнения буфера и остановки проги? Читай то что в пайпе есть по мере появления там данных.

Ты бы поподробнее расписал что получить хочешь, а то ничего не понятно.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390403
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то делал подобное. Может пригодится
Чтение из пайпа в буфер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
	HANDLE hReadStdOut;  // для перехвата вывода консоли
	CHAR szPipeBuf[PIPE_BUF]; // Буфер для кэширования перехвата с консоли
	DWORD dwPipeBuf = 0; // Занято байт в szPipeBuf

// Дочитывание из консоли в буфер
BOOL ReadConsole()
{
	BOOL lOk = lReadConsole;
	DWORD dwAviable;

	if(dwPipeBuf >= PIPE_BUF - 1) lOk = FALSE; // Буфер полный

	if(lOk)
		lOk = PeekNamedPipe(hReadStdOut, NULL, 0, NULL, &dwAviable, 0 );

	if(lOk && dwAviable > 0)
	{
		DWORD dwRead;
		LPSTR pszStart = szPipeBuf + dwPipeBuf;
		DWORD dwLen = PIPE_BUF - dwPipeBuf - 1;
		if(dwLen > dwAviable) dwLen = dwAviable;
		if(!ReadFile(hReadStdOut, pszStart, dwLen, &dwRead, NULL))
		{
			lOk = FALSE;
		}
		else
		{
			dwPipeBuf += dwLen;
			pszStart = szPipeBuf + dwPipeBuf;
			*pszStart = 0;
		}
	}
	return lOk;
}

...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390416
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tkealon(Ruslan)и пока он не заполнится процесс не стопорится.
Опять ничего не понимаю. Зачем тебе ждать заполнения буфера и остановки проги? Читай то что в пайпе есть по мере появления там данных.

Ты бы поподробнее расписал что получить хочешь, а то ничего не понятно.
стопорить нужно внешнию прогу после каждого её printf

задать один байт на размер буфера для пайпа было бы медленным но решением, я просто читал бы до конца строки
но он собака у меня например меньше 4кб не выходит, а это почти весь выхлоп из программы
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390442
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)стопорить нужно внешнию прогу после каждого её printf
В смысле тебе конкретную строчку поймать хочется и по ее выводу прогу тормознуть?

Сомневаюсь что это возможно сделать наблюдая за выводом извне.

Можно влезть в тот процесс и перехватывать там вызов printf(). Работать будет, но писать муторно, у Рихтера подробно расписано.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390471
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожно влезть в тот процесс и перехватывать там вызов printf(). Работать будет, но писать муторно, у Рихтера подробно расписано.
этот путь знаю, но он очень нежелателен вот и ломаю голову
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390486
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот и ломаю голову
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CreateProcess(... , DEBUG_PROCESS, ... , &pi);
// ...
DebugActiveProcessStop(pi.dwProcessId);

  ReadFile(hPipeRead, lpBuffer, 1, ...);
  // ...

DebugActiveProcess(pi.dwProcessId);
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390489
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390575
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima Tпропущено...

Опять ничего не понимаю. Зачем тебе ждать заполнения буфера и остановки проги? Читай то что в пайпе есть по мере появления там данных.

Ты бы поподробнее расписал что получить хочешь, а то ничего не понятно.
стопорить нужно внешнию прогу после каждого её printf

задать один байт на размер буфера для пайпа было бы медленным но решением, я просто читал бы до конца строки
но он собака у меня например меньше 4кб не выходит, а это почти весь выхлоп из программыТак printf - это еще не io c точки зрения ОС, там еще на уровне rtl буферизация есть :)
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390613
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

в стандартный поток вывода никто не буферизует
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39390897
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T,

через пайпы и читаю, дело в том что размер буфера для пайпа довольно большой
MSDNnSize [in]
The size of the buffer for the pipe, in bytes. The size is only a suggestion; the system uses the value to calculate an appropriate buffering mechanism.
и пока он не заполнится процесс не стопорится.


так ну и фиг с ним, пусть работает...
тебе то что?
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391170
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)в стандартный поток вывода никто не буферизует
Да щаззз... Это когда он идёт прямо на консоль, он может не буферизоваться или буферизоваться до строки, а при перенаправлении практически куда угодно он начинает очень даже сильно буферизоваться. RTL не дураки писали.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391270
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Far в моём случае под F3 показывает вполне атомарно появляющиеся маленькие куски
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391280
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM вот и ломаю голову
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CreateProcess(... , DEBUG_PROCESS, ... , &pi);
// ...
DebugActiveProcessStop(pi.dwProcessId);

  ReadFile(hPipeRead, lpBuffer, 1, ...);
  // ...

DebugActiveProcess(pi.dwProcessId);


и в каком месте тогда остановится порождённый процесс после вызова DebugActiveProcessStop?
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391326
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в каком месте тогда остановится порождённый процесс после вызова DebugActiveProcessStop?он не остановится, он запустится )), а остановится после DebugActiveProcess.

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

(а если данные какие во время работы подменить, то посмотри апимоном или идой внутрь, - не выводится ли там, для начала, вся текстовка одним куском.
ну и задачу тогда детальней решать надо)
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391345
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391443
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM( http://delphiworld.narod.ru/base/exploration_tracer.html )

в отладку я знаю как вводить, проблему с безопасностью убивания процесса это не решает

вот ссылки получше
http://alexander-bagel.blogspot.ru/2012/10/debugger-1.html.html
http://alexander-bagel.blogspot.ru/2012/11/debuger-2.html
http://alexander-bagel.blogspot.ru/2012/11/debuger-3.html
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391464
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovRTL не дураки писали
и предусмотрели управление буферизацией
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391627
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в отладку я знаю как вводитьну и выполняй пошагово и делай синхру когда тебе нужно.

проблему с безопасностью убивания процесса это не решает да какие проблемы и зачем его убивать, пусть живёт сколько ему отмеряно. (или это новые условия задачи?)
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391834
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMв отладку я знаю как вводитьну и выполняй пошагово и делай синхру когда тебе нужно.

проблему с безопасностью убивания процесса это не решает да какие проблемы и зачем его убивать, пусть живёт сколько ему отмеряно. (или это новые условия задачи?)
Прога выполняет определённые вещи с очень большими файлами. Обрыв, который нужен по техзаданию, в этот момент может порушить систему.
По ходу процесса она выдаёт процентовку (после каждой атомарной операции - это точно известно) вот потому и желательно 20139343
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391848
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Barlone,

в стандартный поток вывода никто не буферизует
7.19.3 Files, paragraph 7At program startup, three text streams are predefined and need not be opened explicitly - standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device .
Так что, если stdout это pipe, то вполне могут буферизовать.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39391978
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)в стандартный поток вывода никто не буферизуетпроверяем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <stdio.h>
#include <windows.h>
int main()
{
   printf("Hello\n");
   Sleep(10000);
   return 0;
}

Компилируем, запускаем test.exe
Выводится "Hello", потом пауза, и через 10 секунд программа завершается. Так действительно не буферизуется.
А теперь так: test.exe | find "Hello"
Видим сначала паузу 10 секунд, потом выводится "Hello" и программа сразу завершается. Упс. А может это find виноват?
Вставляем fflush(stdout) между printf и Sleep.
Компилируем, запускаем test.exe | find "Hello".
Выводится "Hello", потом пауза. Медитируем над результатом.
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39392000
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

в моём случае видимо fflush не забыли
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39392007
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T,

через пайпы и читаю, дело в том что размер буфера для пайпа довольно большой
MSDNnSize [in]
The size of the buffer for the pipe, in bytes. The size is only a suggestion; the system uses the value to calculate an appropriate buffering mechanism.
и пока он не заполнится процесс не стопорится.А откуда уверенность, что это не буферизация stdout?
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39392180
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneА откуда уверенность, что это не буферизация stdout?
тестовый пример составил с выводом времени
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39392629
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan), все получилось?
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39392780
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonekealon(Ruslan), все получилось?
"легальными способами" - нет, смотрю альтернативные варианты пока
держу хук на крайний случай
...
Рейтинг: 0 / 0
Синхронное чтение вывода процесса
    #39393836
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
kealon(Ruslan)есть консольное приложение (не моё), выводящее текст
как можно организовать его "фриз" пока я не дам ему буфер для вывода? выводи в файл стандартными средствами перенаправления вывода
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Синхронное чтение вывода процесса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]