![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Редирект консольного вывода
бывший © (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]Ну чё, с пингом работает?