Добрый день ! При работе МРВ нужно отловить событие когда оператор нажал кнопку остановить МРВ, и выполнить определённую программу. Это необходимо для установки выходных сигналов в исходное состояние. Как можно это сделать ???
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Тогда необходимо останавливать МРВ не через меню, а программно через системную переменную @Exit - смотрите описание в справочной системе. А в графике реализовать оператору кнопку выключения МРВ.
Posted by PMA (Участник № / Member № 1387) on :
Использовал переменную @Exit, результат очень странный, предполагалось что произойдёт отключение монитора аналогичное нажатию кнопки на бегущем человеке однако... 1. Остановка происходит вроде бы, но сохраняется работоспособность всех графических элементов, то есть можно открывать - закрывать окна вводить значения. 2. Кнопка с бегущим человеком находится в утопленном состоянии, так как будто монитор запущен.
Пожалуйста дайте более подробное описание того, что происходит при присваивании значени 5 переменной @Exit, в документации очень мало информации.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Все верно - сервер останавливается, но графика еще работоспособна, она независит от математики. После останова МРВ может быть закрыт штатными средствами (например, Alt+F4). Других способов нет.
Posted by Виталий (Участник № / Member № 2118) on :
Кстати, в полноэкранном режиме все равно alt+F4 не работает, и смысл в @Exit теряется полностью.
У меня например за машиной сидит "чайник" и для него нажать в полноэкранном режиме с отключенным меню ctrl+f ctrl+r alt+F4 совершенно нереально. Ему надо так - запустил весь проект одной кнопкой (это я по простому на bat сделал) и закрыл одной же кнопкой целиком, т.е. чтобы на экране ничего не осталось и в задачах тоже.
Может быть можно передать среде последовательность нажатых клавиш? Может кто пробовал ActiveX объект сделать, который бы выполнил подобную операцию, или грубо закрыл процесс в диспетчере или еще что от внешнего программирования?
Posted by Дмитрий Юрьевич М. (Участник № / Member № 1930) on :
Подпишусь под каждым словом Виталия. Мне нужно то же самое! Идея была вызвать внешнюю dll, которая найдёт процесс МРВ и добьёт его снаружи. Но пока не писал, всё ещё надеюсь, что ADASTRA Technical Support поможет решить проблему более гуманными способами. Может, в релиз 6.05 добавить такую возможность???? Закрытие программы для чайника?
Posted by Константин Арапов (Участник № / Member № 1998) on :
Народ ! Эта тема параллельно обсуждается в разделе "Мониторы Реального Времени / Real Time Monitors".
Разаработчики сказали, что им "необходимо обоснование, в каких случаях и почему необходима остановка (а возможно и полное завершение работы) удалённого узла." И они просят направлять это обоснование на адрес техподдержки hotline2@adastra.ru
Предлагаю всем написать. Я уже это сделал.
Posted by Константин Арапов (Участник № / Member № 1998) on :
Можно это делать вот так (вариант не оптимален накидал за 5 минут) Пишем на делфи (например) получаем exe теперь если запустить exe то RTM выгрузится полностью. Как запустить внешнее приложение из TM наверное уже все знают. program KillRTM;
begin TheWindow := FindWindow('QWidget', nil); if TheWindow <> 0 then begin GetWindowThreadProcessID(TheWindow, @ProcessID); ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId); TerminateProcess(ProcessHandle,4); end; end.
Posted by Константин Арапов (Участник № / Member № 1998) on :
А если речь идет о закрытии NLL? Насколько я понимаю, там вообще никакой мат. обработки нет. И внешнюю программу, насколько я понимаю запустить нельзя...
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В узле NLL можно использовать программы, а соответственно и внешние библиотеки.
Posted by Константин Арапов (Участник № / Member № 1998) on :
Интересно. Код работает. Возникают два вопроса:
1.Почему именно класс QWidget ? Как Вы определили, можно поинтересоваться ? 2. Не убьем ли мы таким образом какое нибудь другое приложение, имеющее такой же класс ?
Posted by Майборода Алексей (Участник № / Member № 1701) on :
1) Определил при помощь Spy++ входит в состам Visual Studio. 2) Если запустите более одного раза то можете и убить, например у меня была запушена среда разработки и профайлер, первым запуском вынесло профайлер а второй запуск вынес среду разработки . Это я и имел ввиду говоря о неоптимальности. Просто у меня такая задача не стоит и я с этим не занимался, просто столо интересно и накидал за 5 минут. Ещё как вариант можно написать программку которая в это окно будет посылать нажатия клавишь (Ctrl+R и т.д.). Можно узнать какое окно находится под указателем мыши (получим кнопку на которую нажимаем) подняться по иерархии объектов до главного окна и тогда закроется именно то главное окно где был курсор. Вобщем вариантов море, главное фантазия.
Posted by Константин Арапов (Участник № / Member № 1998) on :
Наклепал DLL-ку. Вроде как работает. Вот интересно только КАКИЕ ЕЩЕ приложения эта штука может убить ? Просто я в этих классах окон не секу... То что IDE выбило - фиг с ним, а вот если какое другое приложение... У меня вот куча приложений разных открыто, но вроде как ничего не убилось... Но может быть есть такие приложения ? Если есть, то интересно какие, кроме TM6 IDE ?
Posted by Майборода Алексей (Участник № / Member № 1701) on :
Те приложения графика которых разработана с помощью библииотеки Qt3 (версии могут быть разные). Можно сделать так смотреть есть ли процесс rtm.exe и если есть выполнять код, если нету то не выполнять тем самым вы не убъете остальные приложения.
Posted by Майборода Алексей (Участник № / Member № 1701) on :
Ну вот в общем накидал за 15 минут. Теперь она избавлена от указанных недостатков. Убивает именно процесс rtc.exe и ничего более. program KillRTM;
begin hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); pe32.dwSize := sizeof(PROCESSENTRY32);
if Process32First(hProcessSnap, pe32) then temp := pe32.szExeFile; if Pos('rtc.exe', temp) <> 0 then begin PID := pe32.th32ProcessID; CloseHandle(hProcessSnap); end else begin pe32.dwSize := sizeof(PROCESSENTRY32); while Process32Next(hProcessSnap,pe32) do begin temp := pe32.szExeFile; if Pos('rtc.exe', temp) <> 0 then begin PID := pe32.th32ProcessID; CloseHandle(hProcessSnap); end; pe32.dwSize := sizeof(PROCESSENTRY32); end; end;
if PID <> 0 then begin ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, PID); TerminateProcess(ProcessHandle,4); end;
end.
Posted by amber (Участник № / Member № 4553) on :
Не появились ли в версии 6.07 штатные (более простые) способы добавить на экран кнопку, по нажатии на которую будет останавливаться / закрываться МРВ?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Не появились.
Posted by amber (Участник № / Member № 4553) on :
Планируется ли добавление в будущих релизах?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
По вопросам развития системы следует обращаться по sales@adastra.ru.