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 благополучно делает скрытое окно видимым, но видимое окно скрывать не желает, хотя судя по подсказке к методу, и исходникам к элементу, он это должен делать. Редактировалось 1 раз(а), последний 2017-12-12 23:45:41
|