Вверх ↑
Этот топик читают: Гость
Ответов: 4612
Рейтинг: 746
#46: 2017-12-14 14:22:50 ЛС | профиль | цитата
flint2 писал(а):
Тогда уж надо сделать отдельно doKillProcess и doResetWait без терминации.
Для KillProcess у нас есть другие компоненты. Хотя, кому-нибудь и здесь может пригодиться.

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

0
Ответов: 2059
Рейтинг: 131
#47: 2017-12-14 15:14:48 ЛС | профиль | цитата
Перенёс Сюда:
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
Минуту, сейчас будет окончательный вариант...
Вот:
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="Ошибка создания процесса!"
}



Редактировалось 5 раз(а), последний 2017-12-14 16:01:06
карма: 6

0
Ответов: 5227
Рейтинг: 585
#48: 2017-12-14 15:59:29 ЛС | профиль | цитата
Чем дальше в лес, тем толще партизаны
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 4612
Рейтинг: 746
#49: 2017-12-14 16:50:32 ЛС | профиль | цитата
Предлагаю такое изменения компонента WinExec. WinExec mod 1-5.zip

Изменено поведение.
Событие onExec происходит СРАЗУ после успешного запуска программы. Затем в режиме RunEvent=Wait метод doExec падает на ожидание завершения программы, после чего выдаётся событие onFinished. Ожидание можно прервать методом doAbortWait.
Методы doShellExecute/doRunCpl теперь тоже выдают события onExec/onErrorExeс.

Добавлены события:
- onFinished
- onErrorExeс

Добавлен метод:
- doAbortWait

Косметические изменения:
- в панели свойств свойство FileName поставлено первым по списку
- поправлено описание к точке ExitCode
- в коде метода doRunCpl заменено использование функции WinExec на CreateProcess (как рекомендует Microsoft)

Редактировалось 1 раз(а), последний 2017-12-14 16:55:07
карма: 26

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#50: 2017-12-14 17:39:17 ЛС | профиль | цитата
Netspirit писал(а):
Предлагаю такое изменения компонента WinExec

Это тестовое изменение или окончательное для добавления?
карма: 22

0
Ответов: 4612
Рейтинг: 746
#51: 2017-12-14 17:48:47 ЛС | профиль | цитата
Старался всё сделать максимально тщательно, так что если не заметно каких-либо косяков - можно выкладывать.
Теоретически, можно добавить получение ProcessID и ожидание завершения по doShellExec. Также хочется добавить какое-то специальное значение параметра WorkingDir, чтобы он вычислялся автоматически из Filename (имитация традиционного запуска из Проводника с рабочим каталогом, равным каталогу запускаемой программы) без необходимости использовать FilePartElm. Но пока нету готовых решений.

Редактировалось 2 раз(а), последний 2017-12-14 17:56:50
карма: 26

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#52: 2017-12-14 20:03:22 ЛС | профиль | цитата
Добавил.
карма: 22

0
Ответов: 31
Рейтинг: 0
#53: 2017-12-14 20:48:19 ЛС | профиль | цитата
Netspirit писал(а):
Старался всё сделать максимально тщательно, так что если не заметно каких-либо косяков ...


Спасибо за доработку элемента.
Потестил. Совсем другое дело.
карма: 0

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