Вверх ↑
Ответов: 31
Рейтинг: 0
#1: 2017-12-12 23:40:22 ЛС | профиль | цитата
Netspirit большое спасибо за дополнительные разъяснения

kichrot писал(а):

... большое спасибо за советы. Переделаю схему с их учетом. По результатам отпишусь.


Отписываюсь по итогам экспериментов.
У меня два результата хороший и плохой.
Начну с плохого.
Предложенный Вами способ запуска и контроля за работой процесса:

Netspirit писал(а):
...
В общем, слежение за программой можно организовать значительно проще.


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,[])
}




для меня оказался неприемлем.

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

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

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

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


В связи с указанным, для моих целей невозможно использовать предложенную Вами схему.

Я вернулся к своей схеме контроля за запущенным процессом, выставив в элементе Thread значение свойства FastStop равное True, а в элементе WinExec значение свойства RunEvent равном Async.
Слежение за наличием запущенного процесса организовано вне элемента WinExec.

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

Add(MainForm,10623783,97,84)
{
Height=631
link(onCreate,14060359:doEvent1,[(137,104)(137,90)])
}
Add(TrayIcon,9072061,158,164)
{
FormHook=0
MinimizeInTray=1
ShowWORemoveIcon=0
Point(doAddTrayIcon)
link(onClick,3305856:doBetween,[])
}
Add(PopupMenuEx,14068898,246,171)
{
IconByIndex=0
Menu=#5:Выход|15:Показать/Скрыть|0:|
Bitmaps=[]
link(MenuItemIdx,618039:doEvent,[])
}
Add(WinExec,14874742,263,84)
{
FileName="notepad.exe"
Mode=0
Point(ProcessID)
Point(doConsoleExec)
link(onExec,8258297:doData,[])
}
Add(DoData,8258297,315,84)
{
link(onEventData,12963171:doValue,[(357,90)(357,48)])
link(Data,14874742:ProcessID,[(321,76)(301,76)(301,124)(269,124)])
}
Add(Hub,14060359,146,84)
{
link(onEvent1,14589106:doStart,[])
link(onEvent2,9072061:doAddTrayIcon,[(165,97)(165,111)(150,111)(150,191)])
}
Add(WinTools,293167,290,227)
{
Point(FileName)
Point(isVisible)
link(Handle,264553:Var,[(296,218)(376,218)(376,225)(746,225)])
}
Add(GlobalVar,1216680,740,238)
{
Name="var____Win_Caption"
link(onValue,12362436:doEvent4,[(870,244)(870,134)(746,134)(746,114)])
}
Add(Between,3305856,203,164)
{
Left=Integer(1)
Right=Integer(1)
link(onTrue,14068898:doPopupHere,[])
}
Add(WinInfo,6953584,532,161)
{
Point(ProcessID)
link(onWinInfo,4199406:doEvent1,[])
link(Handle,5159531:Var2,[])
}
Add(WinEnum,704221,602,98)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,6953584:doWinInfo,[(643,104)(643,153)(525,153)(525,167)])
}
Add(GlobalVar,7513859,740,278)
{
Name="var_Win_ClassName"
link(onValue,12362436:doEvent5,[(874,284)(874,129)(751,129)(751,121)])
}
Add(DoData,14488710,693,238)
{
link(onEventData,1216680:doValue,[(737,244)(737,244)])
link(Data,6953584:Caption,[(699,217)(545,217)])
}
Add(DoData,2647657,693,278)
{
link(onEventData,7513859:doValue,[(737,284)(737,284)])
link(Data,6953584:ClassName,[(699,272)(538,272)])
}
Add(If_else,4977417,609,231)
{
link(onTrue,8424737:doEvent1,[])
link(Op1,3837332:Var2,[(615,220)(395,220)])
link(Op2,5633114:Var3,[(622,210)(639,210)(639,199)])
}
Add(Hub,8424737,654,231)
{
OutCount=4
link(onEvent1,704221:doStop,[(675,237)(675,158)(588,158)(588,118)])
link(onEvent2,8667035:doData,[(680,244)(680,188)])
link(onEvent3,14488710:doData,[(684,251)(684,244)])
link(onEvent4,2647657:doData,[(680,258)(680,284)])
}
Add(GlobalVar,264553,740,182)
{
Name="var____Win_Handle"
link(onValue,12362436:doEvent3,[(865,188)(865,139)(740,139)(740,107)])
}
Add(GetDataEx,5159531,532,140)
{
link(Data,704221:Handle,[(538,138)(608,138)])
}
Add(DoData,8667035,693,182)
{
link(onEventData,264553:doValue,[(734,188)(734,188)])
link(Data,5159531:Var3,[(699,145)])
}
Add(IndexToChanel,618039,291,171)
{
link(onEvent1,10623783:doClose,[(335,177)(335,154)(90,154)(90,111)])
link(onEvent2,293167:doVisible,[(335,184)(335,210)(258,210)(258,233)])
}
Add(Thread,14589106,176,84)
{
FastStop=0
Point(doStopFlag)
link(onExec,5000367:doEvent1,[])
}
Add(Hub,4199406,574,161)
{
OutCount=3
link(onEvent1,10571158:doData,[(649,167)(649,51)])
link(onEvent2,4333925:doData,[(654,174)(654,100)])
link(onEvent3,4977417:doCompare,[(592,181)(592,237)])
}
Add(EnumProcess,6545238,427,98)
{
Point(onFind)
Point(onNotFind)
link(ID,3806134:Var2,[(433,79)(377,79)])
link(onFind,3421579:doBeep,[])
link(onNotFind,5000367:doEvent2,[(471,118)(471,149)(220,149)(220,97)])
}
Add(GlobalVar,12963171,371,42)
{
Name="var_Proc_ID"
Data=Integer(0)
link(onValue,3684219:doEvent1,[(467,48)(467,69)])
}
Add(Hub,13933911,371,105)
{
InCount=2
OutCount=1
link(onEvent1,6545238:doFindID,[])
}
Add(Beep,3421579,476,105)
{
Freq=0
Duration=10000
link(onBeep,13933911:doEvent2,[(516,111)(516,144)(355,144)(355,118)])
}
Add(Hub,3684219,483,63)
{
link(onEvent1,704221:doEnum,[(549,69)(549,104)])
link(onEvent2,13933911:doEvent1,[(505,76)(505,86)(364,86)(364,111)])
}
Add(GetDataEx,3806134,371,63)
{
link(Data,12963171:Var,[])
}
Add(Hub,5000367,228,84)
{
InCount=2
OutCount=1
link(onEvent1,14874742:doExec,[])
}
Add(GetDataEx,3837332,389,210)
{
link(Data,3806134:Var1,[(395,68)])
}
Add(Memo,9143625,847,66)
{
Left=25
Top=30
Width=325
Height=525
ScrollBars=2
}
Add(DoData,10571158,693,45)
{
link(onEventData,12362436:doEvent1,[(748,51)(748,93)])
link(Data,3837332:Var3,[(699,25)(521,25)(521,215)])
}
Add(DoData,4333925,693,94)
{
link(onEventData,12362436:doEvent2,[])
link(Data,5633114:Var1,[(699,85)(667,85)(667,194)])
}
Add(Hub,12362436,763,87)
{
InCount=5
OutCount=1
link(onEvent1,5976496:doSynchronize,[])
}
Add(GetDataEx,5633114,623,194)
{
Angle=3
link(Data,6953584:ProcessID,[(552,199)])
}
Add(Synchronize,5976496,798,87)
{
link(onSync,9143625:doAdd,[(838,93)(838,72)])
}

Таким образом подозрения на некорректную работу элемента If_else сняты, но выявлена некорректная работа элемента WinExec.
Помимо этого я подозреваю, что есть ошибка в работе элемента WinTools, конкретно метод doVisible благополучно делает скрытое окно видимым, но видимое окно скрывать не желает, хотя судя по подсказке к методу, и исходникам к элементу, он это должен делать.
карма: 0

0
Редактировалось 1 раз(а), последний 2017-12-12 23:45:41