Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 131
#31: 2017-12-13 01:02:02 ЛС | профиль | цитата
Правильно это как???

Повторяю, WinExec работает правильно!
Если тебе надо получить событие при старте приложения, то бери с хаба перед WinExec и все дела. Но событие происходит сразу после запуска!
Проверяй сомнительные куски в отдельных схемах!!!
Убери задержку из Thread = 1000.
Скрыть и показать окно.

Add(MainForm,10623783,279,140)
{
Height=631
link(onCreate,14060359:doEvent1,[(319,160)(319,146)])
}
Add(TrayIcon,9072061,340,220)
{
FormHook=0
MinimizeInTray=1
ShowWORemoveIcon=0
Point(doAddTrayIcon)
link(onClick,3305856:doBetween,[])
}
Add(PopupMenuEx,14068898,428,227)
{
IconByIndex=0
Menu=#5:Выход|15:Показать/Скрыть|0:|
Bitmaps=[]
link(MenuItemIdx,618039:doEvent,[])
}
Add(WinExec,14874742,445,140)
{
FileName="notepad.exe"
Mode=0
Point(ProcessID)
Point(doConsoleExec)
link(onExec,8258297:doData,[])
}
Add(DoData,8258297,497,140)
{
link(onEventData,12963171:doValue,[(539,146)(539,104)])
link(Data,14874742:ProcessID,[(503,132)(483,132)(483,180)(451,180)])
}
Add(Hub,14060359,328,140)
{
link(onEvent1,14589106:doStart,[])
link(onEvent2,9072061:doAddTrayIcon,[(347,153)(347,167)(332,167)(332,247)])
}
Add(WinTools,293167,472,283)
{
Point(FileName)
Point(isVisible)
link(Handle,264553:Var,[(478,274)(558,274)(558,281)(928,281)])
}
Add(GlobalVar,1216680,922,294)
{
Name="var____Win_Caption"
link(onValue,12362436:doEvent4,[(1052,300)(1052,190)(928,190)(928,170)])
}
Add(Between,3305856,385,220)
{
Left=Integer(1)
Right=Integer(1)
link(onTrue,14068898:doPopupHere,[])
}
Add(WinInfo,6953584,714,217)
{
Point(ProcessID)
link(onWinInfo,4199406:doEvent1,[])
link(Handle,5159531:Var2,[])
}
Add(WinEnum,704221,784,154)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,6953584:doWinInfo,[(825,160)(825,209)(707,209)(707,223)])
}
Add(GlobalVar,7513859,922,334)
{
Name="var_Win_ClassName"
link(onValue,12362436:doEvent5,[(1056,340)(1056,185)(933,185)(933,177)])
}
Add(DoData,14488710,875,294)
{
link(onEventData,1216680:doValue,[])
link(Data,6953584:Caption,[(881,273)(727,273)])
}
Add(DoData,2647657,875,334)
{
link(onEventData,7513859:doValue,[])
link(Data,6953584:ClassName,[(881,328)(720,328)])
}
Add(If_else,4977417,791,287)
{
link(onTrue,8424737:doEvent1,[])
link(Op1,3837332:Var2,[(797,276)(577,276)])
link(Op2,5633114:Var3,[(804,266)(821,266)(821,255)])
}
Add(Hub,8424737,836,287)
{
OutCount=4
link(onEvent1,704221:doStop,[(857,293)(857,214)(770,214)(770,174)])
link(onEvent2,8667035:doData,[(862,300)(862,244)])
link(onEvent3,14488710:doData,[(866,307)(866,300)])
link(onEvent4,2647657:doData,[(862,314)(862,340)])
}
Add(GlobalVar,264553,922,238)
{
Name="var____Win_Handle"
link(onValue,12362436:doEvent3,[(1047,244)(1047,195)(922,195)(922,163)])
}
Add(GetDataEx,5159531,714,196)
{
link(Data,704221:Handle,[(720,194)(790,194)])
}
Add(DoData,8667035,875,238)
{
link(onEventData,264553:doValue,[])
link(Data,5159531:Var3,[(881,201)])
}
Add(IndexToChanel,618039,473,227)
{
link(onEvent1,10623783:doClose,[(517,233)(517,210)(272,210)(272,167)])
link(onEvent2,7220278:doSwitch,[(517,240)(517,270)(394,270)(394,289)])
}
Add(Thread,14589106,358,140)
{
Delay=0
FastStop=0
Point(doStopFlag)
link(onExec,5000367:doEvent1,[])
}
Add(Hub,4199406,756,217)
{
OutCount=3
link(onEvent1,10571158:doData,[(831,223)(831,107)])
link(onEvent2,4333925:doData,[(836,230)(836,156)])
link(onEvent3,4977417:doCompare,[(774,237)(774,293)])
}
Add(EnumProcess,6545238,609,154)
{
Point(onFind)
Point(onNotFind)
link(ID,3806134:Var2,[(615,135)(559,135)])
link(onFind,3421579:doBeep,[])
link(onNotFind,5000367:doEvent2,[(653,174)(653,205)(402,205)(402,153)])
}
Add(GlobalVar,12963171,553,98)
{
Name="var_Proc_ID"
Data=Integer(0)
link(onValue,3684219:doEvent1,[(649,104)(649,125)])
}
Add(Hub,13933911,553,161)
{
InCount=2
OutCount=1
link(onEvent1,6545238:doFindID,[])
}
Add(Beep,3421579,658,161)
{
Freq=0
Duration=10000
link(onBeep,13933911:doEvent2,[(698,167)(698,200)(537,200)(537,174)])
}
Add(Hub,3684219,665,119)
{
link(onEvent1,704221:doEnum,[(731,125)(731,160)])
link(onEvent2,13933911:doEvent1,[(687,132)(687,142)(546,142)(546,167)])
}
Add(GetDataEx,3806134,553,119)
{
link(Data,12963171:Var,[])
}
Add(Hub,5000367,410,140)
{
InCount=2
OutCount=1
link(onEvent1,14874742:doExec,[])
}
Add(GetDataEx,3837332,571,266)
{
link(Data,3806134:Var1,[(577,124)])
}
Add(Memo,9143625,1029,122)
{
Left=25
Top=30
Width=325
Height=525
ScrollBars=2
}
Add(DoData,10571158,875,101)
{
link(onEventData,12362436:doEvent1,[(930,107)(930,149)])
link(Data,3837332:Var3,[(881,81)(703,81)(703,271)])
}
Add(DoData,4333925,875,150)
{
link(onEventData,12362436:doEvent2,[])
link(Data,5633114:Var1,[(881,141)(849,141)(849,250)])
}
Add(Hub,12362436,945,143)
{
InCount=5
OutCount=1
link(onEvent1,5976496:doSynchronize,[])
}
Add(GetDataEx,5633114,805,250)
{
Angle=3
link(Data,6953584:ProcessID,[(734,255)])
}
Add(Synchronize,5976496,980,143)
{
link(onSync,9143625:doAdd,[(1020,149)(1020,128)])
}
Add(Switch,7220278,413,283)
{
DataOn=Integer(1)
DataOff=Integer(0)
link(onSwitch,293167:doVisible,[])
}


Редактировалось 3 раз(а), последний 2017-12-13 01:11:04
карма: 6

0
Ответов: 31
Рейтинг: 0
#32: 2017-12-13 01:18:13 ЛС | профиль | цитата
flint2 писал(а):

Повторяю, WinExec работает правильно!
...


Правильно это как???
Вы можете написать хотя бы таблицу истинности WinExec для всех возможных комбинаций значений его свойств. А после этого согласовать ее с существующей справкой и потребностями обычных пользователей???
Мало того в существующей реализации WinExec просто отсутствуют события успешного запуска процессов для методов doShellExec и doConsoleExec. В чем смысл такой дискриминации???


flint2 писал(а):

...
Если тебе надо получить событие при старте приложения, то бери с хаба перед WinExec и все дела.
...


Зачем мне брать косвенное событие, которое просто элементарно может соврать,так как предшествует началу работы WinExec??? Мне надо событие именно от элемента WinExec, по результатам успешной попытки запуска внешнего процесса, единственное которое не соврет.

--- Добавлено в 2017-12-13 01:27:06

flint2 писал(а):

...
Убери задержку из Thread = 1000.
...


А вот и не угадали. Без этой задержки в свойствах потока элемент WinEnum, находящийся в потоке, первую свою итерацию отрабатывает некорректно, что приводит к некорректному результату сравнения If_Else.

Редактировалось 3 раз(а), последний 2017-12-13 01:29:23
карма: 0

0
Ответов: 2059
Рейтинг: 131
#33: 2017-12-13 01:30:40 ЛС | профиль | цитата
Вы можете написать хотя бы таблицу истинности WinExec для всех возможных комбинаций значений его свойств. А после этого согласовать ее с существующей справкой и потребностями обычных пользователей???

Ау!!!
Это ты к кому?
flint2 писал(а):
Проверяй сомнительные куски в отдельных схемах!!!

kichrot писал(а):
Зачем мне брать косвенное событие, которое просто элементарно может соврать,так как предшествует началу работы WinExec??? Мне надо событие именно от элемента WinExec,

flint2 писал(а):
событие происходит сразу после запуска!

карма: 6

0
Ответов: 31
Рейтинг: 0
#34: 2017-12-13 01:37:23 ЛС | профиль | цитата
flint2 писал(а):

...
flint2 писал(а):
событие происходит сразу после запуска!


Проверьте на этой схеме:



Add(MainForm,2953706,21,105)
{
Position=1
}
Add(Button,1566307,238,224)
{
Left=20
Top=5
Width=120
Caption="Запустить и следить"
link(onClick,14589106:doStart,[])
}
Add(WinExec,12004781,476,224)
{
FileName="notepad.exe"
RunEvent=1
Point(ProcessID)
link(onExec,320100:doSynchronize,[])
}
Add(Button,1320274,273,231)
{
Left=145
Top=5
Width=100
Caption="Прекратить"
link(onClick,14589106:doStopFlag,[])
}
Add(Thread,14589106,350,224)
{
link(onExec,12004781:doExec,[])
}
Add(Memo,9143625,343,105)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(LineBreakEx,14378329,266,105)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(Synchronize,320100,553,224)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,658,224)
{
Caption="log"
}
Add(DoData,9126657,609,224)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}

Очень наглядно видно, что событие происходит после закрытия внешнего процесса.
карма: 0

0
Ответов: 2059
Рейтинг: 131
#35: 2017-12-13 02:02:05 ЛС | профиль | цитата
ты не понимаешь, как работает WinExec и другие компоненты.

Add(Button,1566307,294,182)
{
Left=20
Top=5
Width=120
Caption="Запустить и следить"
link(onClick,14589106:doStart,[])
}
Add(WinExec,12004781,532,182)
{
FileName="notepad.exe"
Point(ProcessID)
link(onExec,320100:doSynchronize,[])
}
Add(Thread,14589106,406,182)
{
Delay=0
FastStop=0
Point(doStopFlag)
link(onExec,12004781:doExec,[])
}
Add(Memo,9143625,399,63)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(LineBreakEx,14378329,322,63)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(Synchronize,320100,609,182)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,714,182)
{
Caption="log"
}
Add(DoData,9126657,665,182)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}

По этому и схемы не правильные составляешь.

Редактировалось 2 раз(а), последний 2017-12-13 02:10:01
карма: 6

0
Ответов: 31
Рейтинг: 0
#36: 2017-12-13 02:10:36 ЛС | профиль | цитата
flint2 писал(а):


Add(Button,1566307,294,182)
{
Left=20
Top=5
Width=120
Caption="Запустить и следить"
link(onClick,14589106:doStart,[])
}
Add(WinExec,12004781,532,182)
{
FileName="notepad.exe"
Point(ProcessID)
link(onExec,320100:doSynchronize,[])
}
Add(Thread,14589106,406,182)
{
Delay=0
FastStop=0
Point(doStopFlag)
link(onExec,12004781:doExec,[])
}
Add(Memo,9143625,399,63)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(LineBreakEx,14378329,322,63)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(Synchronize,320100,609,182)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,714,182)
{
Caption="log"
}
Add(DoData,9126657,665,182)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}



Что же это Вы пытаетесь сфинтить, переведя WinExec в режим Async вместо Wait???
Теперь WinExec НЕ следит за запущенным процессом. А кто должен следить??? Дядя???
Я же уже писал:

kichrot писал(а):

Судя по всему элемент WinExec содержит ошибки в реализации. По крайней мере его функционал расходится с заявленным в справке. Конкретно в справке написано: "onExec - Событие происходит в случае успешного запуска программы методом doExec". По факту:

1) если выставить значение свойства RunEvent равное
Wait то событие onExec наступает не при каждом запуске процесса элементом WinExec, а после прекращения всего цикла итераций в элементе WinExec.

2) событие onExec наступает не по факту запуска процесса, а по факту прекращения его существования.

3) корректно событие onExec наступает только при RunEvent равном Async
...


Так, что неправильно работает WinExec, не выдает в режиме Wait событие о запуске внешнего процесса. Убедились???

Редактировалось 1 раз(а), последний 2017-12-13 02:14:11
карма: 0

0
Ответов: 2059
Рейтинг: 131
#37: 2017-12-13 02:19:34 ЛС | профиль | цитата
Что же это Вы пытаетесь сфинтить, переведя WinExec в режим Async вместо Wait.
Теперь WinExec НЕ следит за запущенным процессом. А кто должен следить??? Дядя???

Всё правильно! Неужели не понятно, что при Wait не будет события до окончания процесса?
Убедились???

Убедился, что ты хочешь от компонента того, что он не должен делать!
Схему нужно другую делать, в соответствии с функционалом компонентов!
Надо изучать и пробовать!
карма: 6

0
Ответов: 31
Рейтинг: 0
#38: 2017-12-13 02:21:45 ЛС | профиль | цитата
flint2 писал(а):

ты не понимаешь, как работает WinExec и другие компоненты. ...


Неужели.


flint2 писал(а):
... По этому и схемы не правильные составляешь.


Стараюсь создавать утилитарные и рабочие программы, из того что есть, любыми способами, а не "правильные", но не рабочие.

P.S. Уважаемый flint2, вместо того, что бы вести конструктивный и доброжелательный диалог, Вы решили поиграть в царя горы???

--- Добавлено в 2017-12-13 02:24:52

flint2 писал(а):

...
Всё правильно! Неужели не понятно, что при Wait не будет события до окончания процесса?
...


Это в какой справке сказано???
Лично мне логика и исходники элемента подсказывают, что это или баг, или недоработка.

Редактировалось 2 раз(а), последний 2017-12-13 02:26:46
карма: 0

0
Ответов: 19
Рейтинг: 7
#39: 2017-12-13 02:57:06 ЛС | профиль | цитата
kichrot,
F1 Справка
2017-12-13_04-50-34.png
примеры есть.

Редактировалось 2 раз(а), последний 2017-12-13 02:59:08
карма: 0

0
Ответов: 31
Рейтинг: 0
#40: 2017-12-13 09:20:12 ЛС | профиль | цитата
Buns писал(а):
kichrot,
F1 Справка
...
примеры есть.


Ни в справке, ни в примерах, ни сном, ни духом не говорится, о том, что событие onExec, в режиме Wait элемента WinExec, наступает после закрытия внешнего процесса, а не так как говорится в справке:
onExec - Событие происходит в случае успешного запуска программы методом doExec

Кроме того, в исходниках элемента процедура:

procedure THIWinExec._work_doExec;
var Fn, Cmd, WD: string;
begin
Fn := ReadString(_Data,_data_FileName,_prop_FileName);
Cmd := ReadString(_Data,_data_Params,_prop_Param);
WD := ReadString(_Data,_data_WorkingDir,_prop_WorkingDir);

if RunProcess(Fn, Cmd, WD, Boolean(_prop_RunEvent)) then
_hi_CreateEvent(_Data, @_event_onExec);
end;

прямо указывает на то, что onExec должно наступать сразу после успешного запуска процесса, при любых значениях RunEvent, т.е. и при Wait. но этого не происходит.

Кроме, как багом, поведение элемента WinExec в режиме Wait, не назовешь.

Редактировалось 3 раз(а), последний 2017-12-13 09:31:37
карма: 0

0
Ответов: 4612
Рейтинг: 746
#41: 2017-12-13 12:12:14 ЛС | профиль | цитата
kichrot писал(а):
Кроме, как багом, поведение элемента WinExec в режиме Wait, не назовешь.
Это не баг, это особенности реализации Просто такой функционал компонента и задумывался, а то что в справке не описано - так там много чего не описано.
kichrot хочет, чтобы имелась возможность узнать, была ли успешно запущена программа в режиме RunEvent=Wait не дожидаясь её завершения. Предполагаю, для решения будет достаточно добавить событие onError, которое будет происходить при ошибке запуска.

Я тут подумал, что можно добавить верхнюю точку, которую при RunEvent=Wait компонент может периодически опрашивать и при получении 1 - прекратить ожидание. Чтобы в моём примере выше ожидающий поток мог завершиться до закрытия программы.

Редактировалось 1 раз(а), последний 2017-12-13 12:19:51
карма: 26

0
Ответов: 31
Рейтинг: 0
#42: 2017-12-13 15:11:37 ЛС | профиль | цитата
Netspirit писал(а):

Это не баг, это особенности реализации ...



Будем считать, что это не баг, а фича.
карма: 0

0
Ответов: 2059
Рейтинг: 131
#43: 2017-12-14 01:05:06 ЛС | профиль | цитата
Netspirit писал(а):
Предполагаю, для решения будет достаточно добавить событие onError, которое будет происходить при ошибке запуска.

Я тут подумал, что можно добавить верхнюю точку, которую при RunEvent=Wait компонент может периодически опрашивать и при получении 1 - прекратить ожидание. Чтобы в моём примере выше ожидающий поток мог завершиться до закрытия программы.

Достаточно добавить событие onError с 1 при успехе и 0 при неудаче, или наоборот - не суть. Тогда получим тот-же onExec - "Событие происходит в случае успешного запуска программы, или неуспехе, методом doExec" и при RunEvent=Wait.
И до кучи добавить точку сброс ожидания "doResetWait".
Примерно так http://forum.hiasm.com/getfile/38265
Схема

Add(MainForm,16265734,84,105)
{
Position=1
}
Add(Button,1566307,301,224)
{
Left=20
Top=5
Width=120
Caption="Запустить и следить"
link(onClick,14589106:doStart,[])
}
Add(Button,1320274,336,238)
{
Left=145
Top=5
Width=100
Caption="Прекратить"
link(onClick,14589106:doStopFlag,[])
}
Add(Thread,14589106,413,224)
{
Point(doStopFlag)
link(onExec,11313095:doExec,[(492,230)(492,279)])
}
Add(Memo,9143625,406,105)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(LineBreakEx,14378329,329,105)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(Synchronize,320100,616,224)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,721,224)
{
Caption="log"
}
Add(DoData,9126657,672,224)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}
Add(WinExecEx,11313095,511,273)
{
FileName="notepad.exe"
RunEvent=1
Point(doKillProcess)
Point(onCreateProcess)
link(onCreateProcess,7655747:doCompare,[])
}
Add(If_else,7655747,574,280)
{
Op2=Integer(0)
link(onTrue,320100:doSynchronize,[(639,286)(639,261)(604,261)(604,230)])
}
Add(Button,7734344,448,301)
{
Left=140
Top=225
Width=95
Caption="KillProcess"
link(onClick,11313095:doKillProcess,[(496,307)(496,293)])
}



Редактировалось 7 раз(а), последний 2017-12-14 12:51:18
карма: 6

0
Ответов: 4612
Рейтинг: 746
#44: 2017-12-14 11:53:12 ЛС | профиль | цитата
1) Называть onError событие, сообщающее об успехе - неправильно.
2) А слабо doResetWait без терминации запущенной программы?
карма: 26

0
Ответов: 2059
Рейтинг: 131
#45: 2017-12-14 12:57:41 ЛС | профиль | цитата
1) Называть onError событие, сообщающее об успехе - неправильно.

Долго врубался, что не так.
Поменял стилистику, теперь onCreateProcess называется, а другая doKillProcess. ttp://forum.hiasm.com/getfile/38265
А слабо doResetWait без терминации запущенной программы?

Тогда уж надо сделать отдельно doKillProcess и doResetWait без терминации.
Правильно мыслю?
Точек будет, как донов Педро в Бразилии и не сосчитаешь!
карма: 6

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