Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине

Автор Тема: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине  (Прочитано 4386 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. С коллегой столкнулись с уникальной проблемой. Коллега тоже тут находится, так что поучаствует в дискуссии.
Имеем два больших плагина. Оба грузятся автоматически. В моём плагине есть такое место:
Код - C# [Выбрать]
  1. private void Documents_DocumentActivated(object sender, DocumentCollectionEventArgs e)
  2. {
  3.     if (e.Document != null)
  4.     {
  5.         e.Document.ImpliedSelectionChanged -= Document_ImpliedSelectionChanged;
  6.         e.Document.ImpliedSelectionChanged += Document_ImpliedSelectionChanged;
  7.     }
  8. }
  9.  
  10. private void Documents_DocumentCreated(object sender, DocumentCollectionEventArgs e)
  11. {
  12.     if (e.Document != null)
  13.     {
  14.         e.Document.ImpliedSelectionChanged -= Document_ImpliedSelectionChanged;
  15.         e.Document.ImpliedSelectionChanged += Document_ImpliedSelectionChanged;
  16.     }
  17. }
  18.  
  19. private void Document_ImpliedSelectionChanged(object sender, EventArgs e)
  20. {
  21.     ShowPropertiesControlsBySelection();
  22. }

Все просто - я подписываюсь на событие ImpliedSelectionChanged и для "своих" объектов отображаю свойства в своей палитре.
На рабочем компе у меня обработка события ImpliedSelectionChanged вообще не происходит. Как будто я и не подписывался. Но, если я отключаю из автозагрузки плагины коллеги, то у меня все нормально работает.
Эмпирическим путем мы пришли к выводу, что если в каком-то из обработчиков ImpliedSelectionChanged происходит не отловленная ошибка, то автокад отписывается от ВСЕХ обработчиков событий. Предположительно конечно )

Конечно коллега со временем найдет проблему и все начнет работать, но вопрос совсем в другом - как в рамках своего плагина решать такую проблему? В данном случае разработчик плагина рядом, но что делать когда такая-же ситуация будет происходить с другими сторонними плагинами?

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ничего с этим ты не поделаешь.
Звучит не оптимистично (
Почему другие обработчики не перестают работать? Documents_DocumentActivated продолжает работать

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
это событие редактора  (хотя завуалировано как будто это событие документа)
На интересную мысль подтолкнули - а если попробовать использовать события Editor.SelectionAdded и Editor.SelectionRemoved?
Единственная проблема, которую пока-что вижу - событие Editor.SelectionAdded при выборе одно отрезка срабатывает порядка 5-6 раз

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
А может периодически переподписываться на ImpliedSelectionChanged.  8)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А может периодически переподписываться на ImpliedSelectionChanged.  8)
И в какой-же момент это делать?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А может периодически переподписываться на ImpliedSelectionChanged.  8)
1. Должен быть баланс подписок/отписок.
2. К сожалению нет адекватного метода для идентификации того подписался ли ты уже или нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Отписаться-подписаться, это же гарантирует одну подписку.
Код - C# [Выбрать]
  1. e.Document.ImpliedSelectionChanged -= Document_ImpliedSelectionChanged;
  2. e.Document.ImpliedSelectionChanged += Document_ImpliedSelectionChanged;

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Отписаться-подписаться, это же гарантирует одну подписку.
Код - C# [Выбрать]
  1. e.Document.ImpliedSelectionChanged -= Document_ImpliedSelectionChanged;
  2. e.Document.ImpliedSelectionChanged += Document_ImpliedSelectionChanged;
Ещё раз спрошу - когда это делать?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Придумать по разному можно.
Например по таймеру.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Например по таймеру
Ну так себе идейка - крутить таймер в автокаде =)

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Эмпирическим путем мы пришли к выводу, что если в каком-то из обработчиков ImpliedSelectionChanged происходит не отловленная ошибка, то автокад отписывается от ВСЕХ обработчиков событий. Предположительно конечно )
Сталкивался с таким, только у меня были события базы данных. Происходит ошибка в обработчике - события перестают работать, соответственно, приложение начинает работать неадекватно. Причём, что неприятно, пользователь это может заметить далеко не сразу.
А может периодически переподписываться на ImpliedSelectionChanged. 
Есть предположение, что не поможет. Надо проверять.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть предположение, что не поможет. Надо проверять.
Моя интуиция подсказывает это же. Там ломается что-то глубинное, что на уровне подписаться/отписаться уже не сработает. Впрочем возможно зависит от того, какое исключение происходит. Например, возможен вариант, что создаются наборы и не удаляются, а это ограниченный ресурс в AutoCAD (не может их быть больше 128).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Off-Topic: показать
а это ограниченный ресурс в AutoCAD (не может их быть больше 128).
7 бит... очень интересная подробность, не знал, что где-то в глубине души автокад семи битный =о).