Вверх ↑
Этот топик читают: Гость
Ответов: 824
Рейтинг: 134
#1: 2016-09-18 13:09:02 ЛС | профиль | цитата
Запускаю консольную программу через doConsoleExec...
Почему-то не происходит событие onConsoleTerminate после того как консольная программа завершила работу.
Что нужно поправить в коде элементе, что-бы событие всегда происходило при завершении консольной программы?
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Ответов: 824
Рейтинг: 134
#2: 2016-09-18 18:33:30 ЛС | профиль | цитата
Тишь да гладь. И только мертвые с косами вдоль дорог стоят....
Печально как-то...
карма: 1

0
Ответов: 8336
Рейтинг: 775
#3: 2016-09-18 19:08:31 ЛС | профиль | цитата
sashaoli, запустил "Фоновое приложение", у него есть точка onStop и отрабатывает по-любому
sashaoli, какой нетерпеливый вы наш
карма: 14

0
Ответов: 824
Рейтинг: 134
#4: 2016-09-18 19:21:43 ЛС | профиль | цитата
Леонид, не то, я запускаю "чужую" программу через WinExec методом doConsoleExec и ожидаю события onConsoleTerminate по завершению "чужой" программы. А оно почему-то не происходит...

Редактировалось 1 раз(а), последний 2016-09-18 19:22:22
карма: 1

0
Ответов: 8336
Рейтинг: 775
#5: 2016-09-18 20:37:55 ЛС | профиль | цитата
sashaoli, а-а, понятно
У меня на onConsoleTerminate событие происходит только при подаче на doConsoleTerminate, правда "Terminate" не происходит Может перед doConsoleTerminate надо параметры заполнять, это к nesco, у него список есть
карма: 14

0
Разработчик
Ответов: 25460
Рейтинг: 2070
#6: 2016-09-18 22:07:18 ЛС | профиль | цитата
Леонид писал(а):
это к nesco, у него список есть

Этим компонентом вообще-то Netspirit вплотную занимался последнее время, я вообще тут мимо проходил.
карма: 19

0
Ответов: 55
Рейтинг: 2
#7: 2016-09-18 23:04:07 ЛС | профиль | цитата
sashaoli, разве только приостановить выполнение своей программы. Не через ConsoleTerminate, конечно, но функцию выполняет, как мне кажется, ту же.
code

Add(MainForm,2953706,77,210)
{
link(onCreate,9696349:doEvent1,[])
}
Add(WinExec,3781635,175,210)
{
FileName="cmd.exe"
RunEvent=1
Point(doConsoleExec)
Point(ExitCode)
}
Add(Message,3729512,231,259)
{
}
Add(Hub,9696349,133,224)
{
link(onEvent1,3781635:doConsoleExec,[])
link(onEvent2,14455067:doData,[(165,237)(165,265)])
}
Add(DoData,14455067,175,259)
{
link(onEventData,3729512:doMessage,[])
link(Data,3781635:ExitCode,[])
}


P.S.: там в коде компонента WinExec в функции ConsoleTerminate строчка "Terminate;", что-то явно она должна делать)
карма: -1

0
Ответов: 824
Рейтинг: 134
#8: 2016-09-18 23:22:00 ЛС | профиль | цитата
Vaeltaja, ну да, может быть...
а если вот так


Add(MainForm,13208603,161,77)
{
Width=367
Height=157
}
Add(WinExec,3781635,301,133)
{
FileName="cmd.exe"
RunEvent=1
Point(doConsoleExec)
Point(ExitCode)
}
Add(Message,3729512,399,196)
{
}
Add(Hub,9696349,259,147)
{
link(onEvent1,3781635:doConsoleExec,[])
link(onEvent2,2868453:doWork1,[(284,160)])
}
Add(DoData,14455067,301,196)
{
link(onEventData,3729512:doMessage,[])
link(Data,3781635:ExitCode,[])
}
Add(Button,5229550,154,196)
{
Left=20
Top=75
Width=300
Caption="Получить код завершения без запуска"
link(onClick,2868453:doWork2,[])
}
Add(HubEx,2868453,280,196)
{
link(onEvent,14455067:doData,[])
}
Add(Button,8567480,154,147)
{
Left=20
Top=35
Width=300
Caption="Запустить и получить код завершения"
link(onClick,9696349:doEvent1,[])
}
Правда прикольно получается?
карма: 1

0
Ответов: 55
Рейтинг: 2
#9: 2016-09-18 23:35:25 ЛС | профиль | цитата
А зачем получать код завершения без предварительного запуска программы?
карма: -1

0
Ответов: 824
Рейтинг: 134
#10: 2016-09-18 23:42:03 ЛС | профиль | цитата
И я о том-же, какая разница между результатом?
карма: 1

0
Ответов: 55
Рейтинг: 2
#11: 2016-09-18 23:47:41 ЛС | профиль | цитата
А, понял. Если через ConsoleExec запускать, то там нужно давать параметр вроде /c <FILE_NAME>.
Пробую так, и так не выходит ничего. Зато если через Exec пускать, то все в порядке. Конечно, окошечко-то появляется консоли, но, как по мне, не жуткая картина.

Скажите, sashaoli, вам нравится консольное окно? Как по мне, впечатляющее

Редактировалось 2 раз(а), последний 2016-09-18 23:51:05
карма: -1

0
Ответов: 3923
Рейтинг: 620
#12: 2016-09-19 11:25:15 ЛС | профиль | цитата
Судя по коду компонента, событие onConsoleTerminate происходит только при doConsoleTerminate и при ошибках работы с каналами вывода. Возможно, если программа завершается корректно, такой метод не всегда срабатывает.

nesco писал(а):
Этим компонентом вообще-то Netspirit вплотную занимался последнее время
Да, только я никак не затрагивал работу с консольными программами. Пока не могу внятно сформулировать, но что-то меня сильно коробит код и работа этого компонента с консольными программами. Например, если запустить программу этим компонентом, а потом завершить работу самого себя, то запущенная программа тоже убивается (после моих изменений это не происходит после doExec, а после doConsoleExec - происходит). Также подозрительна работа параллельного потока при чтении пайпа; опять же, событие onConsoleResult выдаётся асинхронно, хотя можно предоставить выбор.

Кроме того, пайпы - это такая универсальная штука, по-моему, можно даже читать вывод и подавать команды уже запущенной программе. Можно обмениваться данными между своими программами. А это уже напрашивается парочка компонентов "клиент-сервер" со всеми полезными вещами.

Редактировалось 1 раз(а), последний 2016-09-20 10:27:38
карма: 19

0
Ответов: 824
Рейтинг: 134
#13: 2016-09-19 11:43:44 ЛС | профиль | цитата
Тут можно, в процедуре чтения пайпов добавить проверку:
if GetExitCodeProcess(hProcess, FExitCode) and (FExitCode <> STILL_ACTIVE) then 
begin
FRead:= false;
Terminate;
_hi_OnEvent(_event_onConsoleTerminate);
end;
Но я пока не пробовал, сегодня проверю.

--- Добавлено в 2016-09-19 12:00:05

Ну и по ходу дела: для консольной программы огромное значение имеет "рабочий каталог", к сожалению для запуска консольного приложения - это не учтено.
Я, у себя, поправил...

Редактировалось 3 раз(а), последний 2016-09-19 12:00:05
карма: 1

0
Ответов: 824
Рейтинг: 134
#14: 2016-09-19 20:57:16 ЛС | профиль | цитата
Проверил код написанный выше:
Работает, onConsoleTerminate происходит четко.
Только некоторые программы - бросают инфу в пайп и завершают работу. А у меня получается, что пайпы уже убиты и соответственно вывод на onConsoleResult не происходит...
карма: 1

0
Ответов: 2013
Рейтинг: 28
#15: 2019-05-08 22:44:24 ЛС | профиль | цитата
sashaoli писал(а):
Тут можно, в процедуре чтения пайпов добавить проверку:

Где, что добавить? У меня не работает событие onConsoleTerminate. Дайте рабочий код компонента, пожалуйста.
HiAsm b186

Редактировалось 1 раз(а), последний 2019-05-08 22:48:15
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)