Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Редирект консольного вывода


Страницы:   1 2 3 4

бывший ©   (2005-07-18 22:22:00) 

Есть клиент-серверное приложение. сервер сделан в виде консоли. необходим редирект вывода информации из консоли в мое приложение в "реальном масштабе времени" ) понимаю что необходим отдельный поток в котором я и буду совершать действо.

Пробовал создавать пайп и переадресовывать вывод при запуске консоли (createprocess) на этот пайп, постепенно читая из него. во-первых - передается не все, во-вторых в определенный момент консоль виснит. Подобные решения видел на www.sources.ru, к примеру.

В общем, мне нужна именно постепенная передача всего текста, отображаемого в консоле в мое приложение по мере его появления.
Я так понял выхода два - переадресация вывода (к примеру через пайп) - с этим вариантом по непонятным мне причинам облом вышел, чтение из некоего буфера консоли. Мастера, помогите!

Если необходимо привести те коды, что пробовал использовать, приведу. Пока для экономии места оставляю вопрос в таком виде.


бывший   (2005-07-20 11:33:00) [21]

Digitman ©   (20.07.05 11:29) [43]
гы ) да ладно, уже нашли траблу вроде... щас бы понять кто кому и почему мешает...


бывший   (2005-07-20 11:31:00) [22]

поставил таймаут в 1000 - заработало (not idle приоритет) =) но редиректит реально 20% от всей информации и то только в период инициализации сервера. дальше перестает редиректить =(


Digitman   (2005-07-20 11:29:00) [23]


> бывший   (20.07.05 11:22) [40]
> ага, ща изменю приоритет и попробую поменять пайпы местами...


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

"А Вы их дустом не пробовали ?"(с)

нет бы поставить точку останова в теле поточной ф-ции да пройти пошагово - давным-давно уж причину нашел бы)


бывший   (2005-07-20 11:28:00) [24]

priority = idle - получил наверный дескриптор 6, о котором говорил Digitman. бррр... я запутался.

смена пайпов местами, как я и ожидал - не дала результатов. редиректа нету.


Ботвин Дмитрий   (2005-07-20 11:24:00) [25]

Таймаут на всякий случай увеличь со 100 для начала до 500


бывший   (2005-07-20 11:22:00) [26]

ага, ща изменю приоритет и попробую поменять пайпы местами...


alpet   (2005-07-20 11:17:00) [27]

бывший   (20.07.05 11:13) [35]
В смысле не без пайпов, замени код инициации структуры:

start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;

на

start.hStdOutput := ReadPipe; // output - source
start.hStdInput := WritePipe; // keyboard simulation handle


alpet   (2005-07-20 11:15:00) [28]

Блин, точнее метод называется SetPriority. Отвык я от TThread :)


Ботвин Дмитрий   (2005-07-20 11:15:00) [29]

Установка приоритета:

constructor TDosCapture.Create(CmdLine: String);
begin
 CmdRun:=CmdLine;
 FreeOnTerminate:=True;
 Priority := tpIdle;
 inherited Create(False);
end;


alpet   (2005-07-20 11:14:00) [30]

бывший   (20.07.05 11:10) [34]
1. SetThreadPriority - метод класса TThread + F1.
2. Посмотрел сейчас в MSDN - походу в моей программе правильно юзается hStdInput для записи (см. пост [32]). Непонятно тогда почему у тебя пинг с таким кодом работал...


бывший   (2005-07-20 11:13:00) [31]

alpet ©   (20.07.05 11:09) [32]
простите, я вас не до конца понял. как без пайпов то? куда редиректить? или вы имеете в виду что достаточно read-пайпа?

еще раз акцентирую: самое главное, что до потока - редирект был, хотя и 20% текста.

предлагаю вначале разобраться почему поток мешает корректной работоспособности сервера )

з.ы. спасибо вам всем, я рад что вы со мной в трудную минуту =)


Ботвин Дмитрий   (2005-07-20 11:10:00) [32]

> alpet

Дело, конечно, может быть и не в приоритете, просто для подобных
утилит рекомендуется именно простаивающий приоритет, что-бы не
нагружать излишне проц. Хотя это дело каждого...


бывший   (2005-07-20 11:10:00) [33]

alpet ©   (20.07.05 11:02) [30]
сервер... э... а хто его знает ) написан на C++ но с какой библиотекой сходу не скажу - надо копаться. исходников нету ) самое главное, что до потока - редирект был, хотя и 20% текста.

Digitman ©   (20.07.05 11:01) [29]
исключений точно не возникает. щас еще перепроверю всяко разно.

Ботвин Дмитрий   (20.07.05 10:59) [28]
можно попытаться. как задать приоритет потоку если он создан не через CreateThread? я просто в потоках не особо бум-бум. я так понимаю нужен идентификатор потока для этого?


alpet   (2005-07-20 11:09:00) [34]

Попробуй также для начала обойтись без перехвата пайпов. Я тут посмотрел одну рабочую программу ориентированную на Dos приложение - там   start.hStdInput используется для передачи в буфер консоли данных (эмуляции клавиатурного ввода), а в твоем случае производится попытка читать из этого дескриптора. Если судить по логике моей программы должно быть так:

ReadFile(WritePipe, Buffer[0],
       ReadBuffer, BytesRead, nil);

...или я чего-то не понял.


Ботвин Дмитрий   (2005-07-20 11:07:00) [35]

> бывший

А ты не пробывал изменить таймаут у WaitForSingleObject? Это я в примере поставил 100. Реально с таким значением может и не работать...


alpet   (2005-07-20 11:02:00) [36]

Ботвин Дмитрий   (20.07.05 10:59) [28]
WaitForSingleObject вроде выполняет роль своеобразного Sleep, сомнительно что здесь дело в приоритетах.

бывший   (20.07.05 10:57) [27]
Можно узнать на чем и с какой библиотекой написан злополучный сервер?


Digitman   (2005-07-20 11:01:00) [37]


> бывший   (20.07.05 10:41) [25]


отладчик-то что говорит ?!

ставь брейкпойнт на первую же строчку в теле Execute() и пройди пошагово весь код .. убедись что в ходе работы Execute() исключений не возникает


Ботвин Дмитрий   (2005-07-20 10:59:00) [38]

Попробуй задать своему потоку приоритет Idle...


бывший   (2005-07-20 10:57:00) [39]

господа, будите смеяться ) используя thread с ping -t все работает нормально. вопрос дня: каким образом редирект консоли может влиять на работоспособность сервера? сервер запущенный без моего ПО работает нормально. как можно отладить и разобраться в чем траблы?

на данный момент использую только 1 поток (см. пример [21]), как я уже говорил работает с пингом, не работает с сервером - держит сервер, не дает ему грузиться, пока не завершу поток/приложение.

жду ваших советов, Мастера.


Ботвин Дмитрий   (2005-07-20 10:56:00) [40]

Ну чё, с пингом работает?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо