Netspirit писал(а):
Там ожидание реализовуется WaitForSingleObject() по хендлу запущенного процесса. Для того, чтобы реализовать doResetWait нужно создавать отдельный объект Events и ждать по нему и по хендлу через WaitForMultipleObjects(). А в текущей реализации досточно WaitForSingleObject() с таймшитом в 1 сек поместить в цикл, в котором проверять состояние верхней точки.Уж очень не нравятся циклы для опроса точек, с таймшитом и без.
Чем подавать чего-то на верхнюю точку, лучше сразу вызвать метод.
Сделал вариант с doKillProcess и doResetWait. http://forum.hiasm.com/getfile/38266
doResetWait работает через BOOL FindCloseChangeNotification - Удаляет сигнализирующий объект.
Не нравится. Вообще никак не пойму смысла в прерывании ожидания, раз есть onCreateProcess.
Проба
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,672,280)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,777,280)
{
Caption="log"
}
Add(DoData,9126657,728,280)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}
Add(WinExecEx,11313095,511,273)
{
FileName="notepad.exe"
RunEvent=1
Point(doKillProcess)
Point(onCreateProcess)
Point(doResetWait)
link(onExec,973869:doMessage,[(555,279)(555,195)])
link(onCreateProcess,7655747:doCompare,[])
}
Add(If_else,7655747,574,280)
{
Op2=Integer(0)
link(onTrue,320100:doSynchronize,[])
}
Add(Button,7734344,448,287)
{
Left=15
Top=225
Width=95
Caption="KillProcess"
link(onClick,11313095:doKillProcess,[])
}
Add(Button,16449998,448,350)
{
Left=150
Top=225
link(onClick,11313095:doResetWait,[(496,356)(496,300)])
}
Add(Message,973869,567,189)
{
Message="Сигнализирующий объект удалён!"
}
Минуту, сейчас будет окончательный вариант...
Вот:
http://forum.hiasm.com/getfile/38267
Схема.
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,672,280)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,777,280)
{
Caption="log"
}
Add(DoData,9126657,728,280)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}
Add(WinExecEx,11313095,511,273)
{
FileName="notepad.exe"
RunEvent=1
Point(doKillProcess)
Point(onCreateProcess)
Point(onProcessError)
link(onCreateProcess,320100:doSynchronize,[])
link(onProcessError,973869:doMessage,[(555,293)(555,370)])
}
Add(Button,7734344,448,287)
{
Left=15
Top=225
Width=95
Caption="KillProcess"
link(onClick,11313095:doKillProcess,[])
}
Add(Message,973869,609,364)
{
Message="Ошибка создания процесса!"
}