Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: avc от 30-06-2019, 10:00:43

Название: Как известить все плагины о изменениях настроек?
Отправлено: avc от 30-06-2019, 10:00:43
Есть несколько моих плагинов с общими настройками. Когда пользователь меняет настройки одного плагина, все остальные должны получить извещение. В идеале - даже если пользователя угораздило запустить два Автокада. Помниться давным давно в дельфи это решалось заталкиванием события в очередь windows и подпиской на это событие. И ни каких циклов опроса не требовалось. В C# наверняка тоже так можно, не пойму как. Система обработки событий работает только в пределах одной dll. Очереди событий вроде как есть,  но вроде не про то. В самом Автокаде подходящих событий не могу найти. Могу конечно записать куда нибудь метку времени последнего изменения настроек. Подходящих мест полно: в файл, в реестр, в переменную Автокада. Мутаксы еще есть какие-то мутные. Но потом придется во всех плагинах циклически считывать эту метку и сравнивать. Но это же велосипед, костыль и нафталин в одном флаконе. Может есть что по лучше? Много гуглил тему - все не то :(
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: Александр Пекшев aka Modis от 30-06-2019, 10:44:31
Ну если прям оно того действительно стоит, то можно смотреть в сторону служб и wcf. Вот, например (https://habr.com/ru/post/331952/). Можно вместо wcf заюзать обычные сокеты, но все-равно нужен сервер (в той-же самой службе). Но это Hard Mode! Зачем? Если вы храните свои настройки где-то (файл или реестр), то вы в плагине должны их получать по запросу в момент использования, а не один раз при загрузке - тогда у вас практически всегда будут совпадать настройки разных плагинов даже в разных открытых автокадах
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: avc от 30-06-2019, 11:08:39
Настройки в реестре. Само собой при вызове команд, настройки считываются заново. но есть еще панели Автокада, обработчики событий и т.п. Самая большая проблема в самом Автокаде - одна страничка диалога Options ничего не знает о других страничках.
Ну и я имел ввиду, что должно же быть тривиальное решение из трех строк кода. Оно точно раньше было в куда более древних языках программирования и я этим даже пользовался. И вдруг это стало сложно. Подозреваю, что я чтото простое упускаю из вида.
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: Александр Ривилис от 30-06-2019, 14:13:56
Ну и я имел ввиду, что должно же быть тривиальное решение из трех строк кода.
Ну такого ты точно не найдёшь. Есть широковещательное оповещение: HWND_BROADCAST, но вряд ли это тебе поможет. Проще в событии типа Application.Idle проверять настройки.
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: Александр Ривилис от 30-06-2019, 14:51:32
Настройки в реестре.
А тогда возможно использовать:
RegistryValueChangeEvent
RegistryKeyChangeEvent
RegistryTreeChangeEvent
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: avc от 30-06-2019, 15:47:27
Есть широковещательное оповещение: HWND_BROADCAST, но вряд ли это тебе поможет.
Погуглил это. Похоже на то что искал. По крайней мере есть отправка сообщений и получение его в другом потоке. Смущают коментарии про Окна верхнего уровня. Буду пробовать.
Про Application.Idle - именно этого и хотелось избежать. И вообще любых циклических опросов в стиле MS DOS. Но раз это проще - то конечно так и сделаю. Немножко удивляет, что в Винде нет способов передачи сообщений между программами. Ну да ладно, изобретем велосипед :)
Спасибо
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: Александр Ривилис от 30-06-2019, 15:49:09
Про Application.Idle - именно этого и хотелось избежать. И вообще любых циклических опросов в стиле MS DOS.
При чем тут циклические опросы? Это же событие.
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: Александр Ривилис от 30-06-2019, 15:52:29
Немножко удивляет, что в Винде нет способов передачи сообщений между программами.
Почему же нет? Есть. Pipe: https://docs.microsoft.com/en-us/dotnet/standard/io/pipe-operations
Но не уверен, что тебе это нужно.
Название: Re: Как известить все плагины о изменениях настроек?
Отправлено: avc от 30-06-2019, 15:53:12
Это же событие.
Да, но дальше то надо тупо перечитывать настройки. Принцип тот же что и из таймера перечитывать. То есть это НЕ событие изменения моих данных.