Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#16: 2009-05-09 13:13:40 ЛС | профиль | цитата
-= DriveR =- писал(а):
Как дождаться завершения не консольной программы и после этого выдать любое событие?

А чем не устраивает свойство RunEvent? Если надо, чтобы программа не висла, запускай в отдельном потоке.

Add(WinExec,8313212,371,161)
{
FileName="notepad.exe"
RunEvent=1
link(onExec,10067890:doMessage,[])
}
Add(Button,6671266,259,161)
{
Left=70
Top=40
link(onClick,15329468:doStart,[])
}
Add(Message,10067890,427,161)
{
}
Add(Thread,15329468,315,161)
{
FastStop=0
link(onExec,8313212:doExec,[])
}
карма: 1

1
Голосовали:Vlad.-
Разработчик
Ответов: 26305
Рейтинг: 2146
#17: 2009-05-09 13:30:15 ЛС | профиль | цитата
tsdima писал(а):
чтобы программа не висла

Ты лучше раскажи -- какого черта она виснет Такое впечатление, что запущенная прога не получает WM_CLOSE, или проблема с отработкой очереди сообщений в нулевом кольце
карма: 22

0
Ответов: 2125
Рейтинг: 159
#18: 2009-05-09 15:21:12 ЛС | профиль | цитата
nesco, под словом "виснет" я имел ввиду, что программа ждёт завершения запущенного процесса и не реагирует на сообщения. Т.е. окно программы становится белым и не реагирует на мышь и клаву. При чём тут WM_CLOSE?
карма: 1

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#19: 2009-05-09 15:43:03 ЛС | профиль | цитата
tsdima писал(а):
nesco, под словом "виснет" я имел ввиду, что программа ждёт завершения запущенного процесса и не реагирует на сообщения. Т.е. окно программы становится белым и не реагирует на мышь и клаву. При чём тут WM_CLOSE?

Я совсем не к тому написал, а вот к этому. И где тут про белое окно написано
Vlad.- писал(а):
Странность в том что версии компонентов (по моему) одинаковые а схема у меня не работает(если calc.exe запускать с помощью компонента WinExec, после завершения работы calc.exe EnumProcess попрежнему уверен что calc ещё висит в процессах)

Вот и объясни -- какого черта убитый процесс висит в памяти, как рабочий, и это наблюдается при WinExec и не наблюдается при ShellExec
карма: 22

0
Ответов: 2125
Рейтинг: 159
#20: 2009-05-09 22:30:09 ЛС | профиль | цитата
nesco писал(а):
Вот и объясни

У меня работает как надо, чего объяснять-то?
карма: 1

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#21: 2009-05-09 23:13:26 ЛС | профиль | цитата
tsdima писал(а):
У меня работает как надо, чего объяснять-то?

И у меня работает, а вот у чела -- бублик...
карма: 22

0
Ответов: 373
Рейтинг: 108
#22: 2009-05-09 23:52:14 ЛС | профиль | цитата
nesco писал(а):
Вот и объясни -- какого черта убитый процесс висит в памяти, как рабочий, и это наблюдается при WinExec и не наблюдается при ShellExec

и при WinExec.Wait CreateProcess тоже не наблюдается.
c wordpad.exe получается.
--------------------------------------------------------------------
А можно заменить WinExec.Async так что-бы запуск был через CreateProcess а не WinExec?

-----------
http://pisoft.ru/verstak/createprocess.htm
Легче всего использовать WinExec. Однако Microsoft не рекомендует его использование, а предлагает пользоваться CreateProcess

------------ Дoбавленo в 03.46:
Скопировал calc.exe из system32 в другую папку, теперь работает.
Кто-нибудь знает почему так?
------------ Дoбавленo в 04.58:
заменил процедуру WinExec.Async.
не помогло


procedure THIWinExec.Async;
var
si: Tstartupinfo;
p: Tprocessinformation;
begin
FillChar( Si, SizeOf( Si ) , 0 );
with Si do
begin
cb := SizeOf( Si);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := _prop_Mode;
end;

CreateProcess(nil,PChar(trim(Fn + + Params)), nil, nil,
false, CREATE_DEFAULT_ERROR_MODE, nil, nil, si, p);
WaitForSingleObject(p.hProcess, 0);
_hi_onEvent(_event_onExec);
end;
карма: 0

0
Ответов: 2125
Рейтинг: 159
#23: 2009-05-10 14:21:22 ЛС | профиль | цитата
Vlad.- писал(а):
Кто-нибудь знает почему так?


Ну, если:
Vlad.- писал(а):
заменил процедуру WinExec.Async

то всё может быть


------------ Дoбавленo в 14.28:
Кстати, если запустить калькулятор до схемы, то схема уже не работает, как надо. Второй калькулятор-то запускается, а вот сообщения нет и не будет, до тех пор пока первый калькулятор не закроете. Я так полагаю, это и происходило в описываемом случае
Vlad.- писал(а):
Странность в том что версии компонентов (по моему) одинаковые а схема у меня не работает(если calc.exe запускать с помощью компонента WinExec, после завершения работы calc.exe EnumProcess попрежнему уверен что calc ещё висит в процессах)

В процессах висел другой калькулятор. А с копированием в другой каталог это никак не связано: на след. день второго калькулятора в процессах просто не было.
карма: 1

0
Ответов: 373
Рейтинг: 108
#24: 2009-05-11 02:08:29 ЛС | профиль | цитата
tsdima писал(а):
Кстати, если запустить калькулятор до схемы, то схема уже не работает, как надо. Второй калькулятор-то запускается, а вот сообщения нет и не будет, до тех пор пока первый калькулятор не закроете. Я так полагаю, это и происходило в описываемом случае

Второй калькулятор , в процессах не висит.
Если запускать не из схемы то работает(winexec в схеме предварительно отключил )
tsdima писал(а):
В процессах висел другой калькулятор

не висел
tsdima писал(а):
А с копированием в другой каталог это никак не связано: на след. день второго калькулятора в процессах просто не было.

почему же тогда при запуске из другого каталога всё работает?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
и не понятно почему при WinExec.Wait работает ,а при WinExec.Async нет ?


------------ Дoбавленo в 02.25:



Add(WinExec,8313212,287,259)
{
FileName="calc.exe"
Point(onConsoleTerminate)
link(onExec,12851773:doTimer,[])
}
Add(Button,6671266,224,259)
{
Left=70
Top=40
link(onClick,8313212:doExec,[])
}
Add(Message,10067890,553,252)
{
}
Add(EnumProcess,4878198,455,238)
{
DebugPrivilege=0
Point(doFindName)
Point(onNotFind)
Point(onEndEnum)
Point(onFind)
link(onNotFind,3683641:doEvent1,[])
}
Add(Hub,3683641,511,245)
{
link(onEvent1,12851773:doStop,[(537,251)(537,261)(338,261)(338,272)])
link(onEvent2,10067890:doMessage,[])
}
Add(Timer,12851773,350,259)
{
Interval=300
Enable=1
link(onTimer,15281733:doData,[])
}
Add(DoData,15281733,399,259)
{
Data=String(calc.exe)
link(onEventData,4878198:doFindName,[])
}
Add(WinExec,14919492,294,469)
{
FileName="notepad.exe"
Point(onConsoleTerminate)
link(onExec,13312384:doTimer,[])
}
Add(Button,6995043,231,469)
{
Left=70
Top=110
link(onClick,14919492:doExec,[])
}
Add(Message,5131951,560,462)
{
}
Add(EnumProcess,10339763,462,448)
{
DebugPrivilege=0
Point(doFindName)
Point(onNotFind)
Point(onEndEnum)
Point(onFind)
link(onNotFind,13578842:doEvent1,[])
}
Add(Hub,13578842,518,455)
{
link(onEvent1,13312384:doStop,[(544,461)(544,471)(345,471)(345,482)])
link(onEvent2,5131951:doMessage,[])
}
Add(Timer,13312384,357,469)
{
Interval=300
Enable=1
link(onTimer,2124979:doData,[])
}
Add(DoData,2124979,406,469)
{
Data=String(notepad.exe)
link(onEventData,10339763:doFindName,[])
}
Add(WinExec,9281908,294,595)
{
FileName="cmd.exe /c calc.exe"
Point(onConsoleTerminate)
link(onExec,8809687:doTimer,[])
}
Add(Button,4618327,231,595)
{
Left=70
Top=145
link(onClick,9281908:doExec,[])
}
Add(Message,5261195,560,588)
{
}
Add(EnumProcess,10122079,462,574)
{
DebugPrivilege=0
Point(doFindName)
Point(onNotFind)
Point(onEndEnum)
Point(onFind)
link(onNotFind,9715115:doEvent1,[])
}
Add(Hub,9715115,518,581)
{
link(onEvent1,8809687:doStop,[(544,587)(544,597)(345,597)(345,608)])
link(onEvent2,5261195:doMessage,[])
}
Add(Timer,8809687,357,595)
{
Interval=300
Enable=1
link(onTimer,21306:doData,[])
}
Add(DoData,21306,406,595)
{
Data=String(calc.exe)
link(onEventData,10122079:doFindName,[])
}
Add(WinExec,5383457,287,371)
{
FileName="calc.exe"
RunEvent=1
Point(onConsoleTerminate)
link(onExec,3994790:doTimer,[])
}
Add(Button,2751128,224,371)
{
Left=70
Top=75
link(onClick,5383457:doExec,[])
}
Add(Message,11665967,553,364)
{
}
Add(EnumProcess,10585460,455,350)
{
DebugPrivilege=0
Point(doFindName)
Point(onNotFind)
Point(onEndEnum)
Point(onFind)
link(onNotFind,7551092:doEvent1,[])
}
Add(Hub,7551092,511,357)
{
link(onEvent1,3994790:doStop,[(537,363)(537,373)(338,373)(338,384)])
link(onEvent2,11665967:doMessage,[])
}
Add(Timer,3994790,350,371)
{
Interval=300
Enable=1
link(onTimer,13804454:doData,[])
}
Add(DoData,13804454,399,371)
{
Data=String(calc.exe)
link(onEventData,10585460:doFindName,[])
}
Add(PointHint,11637887,210,217)
{
Info=#8:не пашет|
Transparent=0
VAlign=0
Width=456
Height=18
}
Add(PointHint,2317134,210,329)
{
Info=#5:пашет|
Transparent=0
VAlign=0
Width=456
Height=18
}
Add(PointHint,14510364,217,427)
{
Info=#5:пашет|
Transparent=0
VAlign=0
Width=456
Height=18
}
Add(PointHint,11966711,210,546)
{
Info=#5:пашет|
Transparent=0
VAlign=0
Width=456
Height=18
}

карма: 0

0
Ответов: 2125
Рейтинг: 159
#25: 2009-05-11 13:49:04 ЛС | профиль | цитата
Vlad.- писал(а):
и не понятно почему при WinExec.Wait работает ,а при WinExec.Async нет ?

Двумя постами выше ты говорил, что заменил процедуру Async (т.е. RunEvent=Async эквивалентно RunEvent=Wait) и не помогло. Чего-то ты не договариваешь...
В вышеприведённом примере у меня работают все 4 кнопки.
карма: 1

0
Ответов: 373
Рейтинг: 108
#26: 2009-05-12 00:22:01 ЛС | профиль | цитата
tsdima писал(а):
Двумя постами выше ты говорил, что заменил процедуру Async (т.е. RunEvent=Async эквивалентно RunEvent=Wait)

не совсем - WaitForSingleObject(p.hProcess, 0)
только убрал бесконечную задержку
---------------------------------------------------------------------------------
ещё прикол:
если первой нажимаю вторую кнопку то после закрытия calc и и мессаги другие кнопки не выдают сообщения после закрытия calc.
------------ Дoбавленo в 00.43:
exe
карма: 0

0
Ответов: 1328
Рейтинг: 69
#27: 2009-05-12 02:35:24 ЛС | профиль | цитата
Vlad.- писал(а):
ещё прикол:
если первой нажимаю вторую кнопку то после закрытия calc и и мессаги другие кнопки не выдают сообщения после закрытия calc.

Только при первом запуске проги, а последующие запуски выдают в любом варианте
карма: 2

0
Ответов: 373
Рейтинг: 108
#28: 2009-05-12 11:59:46 ЛС | профиль | цитата
Konst писал(а):
Только при первом запуске проги, а последующие запуски выдают в любом варианте

Что то я запутался, а чем последующие запуски могут отличаться от первого?
карма: 0

0
Ответов: 1328
Рейтинг: 69
#29: 2009-05-12 15:45:56 ЛС | профиль | цитата
Vlad.-, не знаю, что у тебя там намучено, сейчас после нажатия 2 й кнопки нет сообщения только после закрытия блокнота, остальные все ок.
------------ Дoбавленo в 15.48:
А блокнот ваще перестал реагировать, т.к. он не закрывается, а висит в процессах
------------ Дoбавленo в 15.49:
Когда мочу его в диспетчере, сообщение вылетает.
------------ Дoбавленo в 15.54:
А блокнот в диспетчере был не "безымянный-блокнот" а что-то с "autorun", жалко не переписал название, видно в этом и была проблема, сейчас сообщения выскакивают в любом порядке нажатия кнопок.
карма: 2

0
Гость
Ответов: 17029
Рейтинг: 0
#30: 2009-05-12 17:16:29 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2025-01-11 06:19:50
карма: 0

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