Как известить все плагины о изменениях настроек?

Автор Тема: Как известить все плагины о изменениях настроек?  (Прочитано 7928 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Есть несколько моих плагинов с общими настройками. Когда пользователь меняет настройки одного плагина, все остальные должны получить извещение. В идеале - даже если пользователя угораздило запустить два Автокада. Помниться давным давно в дельфи это решалось заталкиванием события в очередь windows и подпиской на это событие. И ни каких циклов опроса не требовалось. В C# наверняка тоже так можно, не пойму как. Система обработки событий работает только в пределах одной dll. Очереди событий вроде как есть,  но вроде не про то. В самом Автокаде подходящих событий не могу найти. Могу конечно записать куда нибудь метку времени последнего изменения настроек. Подходящих мест полно: в файл, в реестр, в переменную Автокада. Мутаксы еще есть какие-то мутные. Но потом придется во всех плагинах циклически считывать эту метку и сравнивать. Но это же велосипед, костыль и нафталин в одном флаконе. Может есть что по лучше? Много гуглил тему - все не то :(

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ну если прям оно того действительно стоит, то можно смотреть в сторону служб и wcf. Вот, например. Можно вместо wcf заюзать обычные сокеты, но все-равно нужен сервер (в той-же самой службе). Но это Hard Mode! Зачем? Если вы храните свои настройки где-то (файл или реестр), то вы в плагине должны их получать по запросу в момент использования, а не один раз при загрузке - тогда у вас практически всегда будут совпадать настройки разных плагинов даже в разных открытых автокадах

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Настройки в реестре. Само собой при вызове команд, настройки считываются заново. но есть еще панели Автокада, обработчики событий и т.п. Самая большая проблема в самом Автокаде - одна страничка диалога Options ничего не знает о других страничках.
Ну и я имел ввиду, что должно же быть тривиальное решение из трех строк кода. Оно точно раньше было в куда более древних языках программирования и я этим даже пользовался. И вдруг это стало сложно. Подозреваю, что я чтото простое упускаю из вида.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну и я имел ввиду, что должно же быть тривиальное решение из трех строк кода.
Ну такого ты точно не найдёшь. Есть широковещательное оповещение: HWND_BROADCAST, но вряд ли это тебе поможет. Проще в событии типа Application.Idle проверять настройки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Настройки в реестре.
А тогда возможно использовать:
RegistryValueChangeEvent
RegistryKeyChangeEvent
RegistryTreeChangeEvent
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Есть широковещательное оповещение: HWND_BROADCAST, но вряд ли это тебе поможет.
Погуглил это. Похоже на то что искал. По крайней мере есть отправка сообщений и получение его в другом потоке. Смущают коментарии про Окна верхнего уровня. Буду пробовать.
Про Application.Idle - именно этого и хотелось избежать. И вообще любых циклических опросов в стиле MS DOS. Но раз это проще - то конечно так и сделаю. Немножко удивляет, что в Винде нет способов передачи сообщений между программами. Ну да ладно, изобретем велосипед :)
Спасибо

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Про Application.Idle - именно этого и хотелось избежать. И вообще любых циклических опросов в стиле MS DOS.
При чем тут циклические опросы? Это же событие.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Немножко удивляет, что в Винде нет способов передачи сообщений между программами.
Почему же нет? Есть. Pipe: https://docs.microsoft.com/en-us/dotnet/standard/io/pipe-operations
Но не уверен, что тебе это нужно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Это же событие.
Да, но дальше то надо тупо перечитывать настройки. Принцип тот же что и из таймера перечитывать. То есть это НЕ событие изменения моих данных.