Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Синхронное чтение вывода процесса / 25 сообщений из 33, страница 1 из 2
24.01.2017, 13:07
    #39390220
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
Доброго дня всем!!!

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

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


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

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

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

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

Пайпы чем не устроили? Как консоль читаешь?
...
Рейтинг: 0 / 0
24.01.2017, 14:14
    #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
24.01.2017, 15:47
    #39390382
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
kealon(Ruslan)и пока он не заполнится процесс не стопорится.
Опять ничего не понимаю. Зачем тебе ждать заполнения буфера и остановки проги? Читай то что в пайпе есть по мере появления там данных.

Ты бы поподробнее расписал что получить хочешь, а то ничего не понятно.
...
Рейтинг: 0 / 0
24.01.2017, 16:04
    #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
24.01.2017, 16:14
    #39390416
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
Dima Tkealon(Ruslan)и пока он не заполнится процесс не стопорится.
Опять ничего не понимаю. Зачем тебе ждать заполнения буфера и остановки проги? Читай то что в пайпе есть по мере появления там данных.

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

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

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

Можно влезть в тот процесс и перехватывать там вызов printf(). Работать будет, но писать муторно, у Рихтера подробно расписано.
...
Рейтинг: 0 / 0
24.01.2017, 16:58
    #39390471
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
Dima TМожно влезть в тот процесс и перехватывать там вызов printf(). Работать будет, но писать муторно, у Рихтера подробно расписано.
этот путь знаю, но он очень нежелателен вот и ломаю голову
...
Рейтинг: 0 / 0
24.01.2017, 17:18
    #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
24.01.2017, 17:23
    #39390489
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
...
Рейтинг: 0 / 0
24.01.2017, 18:43
    #39390575
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
kealon(Ruslan)Dima Tпропущено...

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

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

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

в стандартный поток вывода никто не буферизует
...
Рейтинг: 0 / 0
25.01.2017, 11:39
    #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
25.01.2017, 14:37
    #39391170
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
kealon(Ruslan)в стандартный поток вывода никто не буферизует
Да щаззз... Это когда он идёт прямо на консоль, он может не буферизоваться или буферизоваться до строки, а при перенаправлении практически куда угодно он начинает очень даже сильно буферизоваться. RTL не дураки писали.
...
Рейтинг: 0 / 0
25.01.2017, 15:47
    #39391270
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
Dimitry Sibiryakov,

Far в моём случае под F3 показывает вполне атомарно появляющиеся маленькие куски
...
Рейтинг: 0 / 0
25.01.2017, 15:58
    #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
25.01.2017, 16:46
    #39391326
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
и в каком месте тогда остановится порождённый процесс после вызова DebugActiveProcessStop?он не остановится, он запустится )), а остановится после DebugActiveProcess.

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

(а если данные какие во время работы подменить, то посмотри апимоном или идой внутрь, - не выводится ли там, для начала, вся текстовка одним куском.
ну и задачу тогда детальней решать надо)
...
Рейтинг: 0 / 0
25.01.2017, 17:01
    #39391345
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
...
Рейтинг: 0 / 0
25.01.2017, 18:22
    #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
25.01.2017, 18:43
    #39391464
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
Dimitry SibiryakovRTL не дураки писали
и предусмотрели управление буферизацией
...
Рейтинг: 0 / 0
25.01.2017, 21:17
    #39391627
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронное чтение вывода процесса
в отладку я знаю как вводитьну и выполняй пошагово и делай синхру когда тебе нужно.

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

проблему с безопасностью убивания процесса это не решает да какие проблемы и зачем его убивать, пусть живёт сколько ему отмеряно. (или это новые условия задачи?)
Прога выполняет определённые вещи с очень большими файлами. Обрыв, который нужен по техзаданию, в этот момент может порушить систему.
По ходу процесса она выдаёт процентовку (после каждой атомарной операции - это точно известно) вот потому и желательно 20139343
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Синхронное чтение вывода процесса / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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