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

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 07-11-2018, 17:17:23

Название: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Пекшев aka Modis от 07-11-2018, 17:17:23
Всем привет. С коллегой столкнулись с уникальной проблемой. Коллега тоже тут находится, так что поучаствует в дискуссии.
Имеем два больших плагина. Оба грузятся автоматически. В моём плагине есть такое место:
Код - 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 происходит не отловленная ошибка, то автокад отписывается от ВСЕХ обработчиков событий. Предположительно конечно )

Конечно коллега со временем найдет проблему и все начнет работать, но вопрос совсем в другом - как в рамках своего плагина решать такую проблему? В данном случае разработчик плагина рядом, но что делать когда такая-же ситуация будет происходить с другими сторонними плагинами?
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Ривилис от 07-11-2018, 17:29:35
Эмпирическим путем мы пришли к выводу, что если в каком-то из обработчиков ImpliedSelectionChanged происходит не отловленная ошибка, то автокад отписывается от ВСЕХ обработчиков событий. Предположительно конечно )
Вполне возможно. Скорее всего разрушается (обнуляется) таблица обработчиков.
Конечно коллега со временем найдет проблему и все начнет работать, но вопрос совсем в другом - как в рамках своего плагина решать такую проблему? В данном случае разработчик плагина рядом, но что делать когда такая-же ситуация будет происходить с другими сторонними плагинами?
Ничего с этим ты не поделаешь.
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Пекшев aka Modis от 07-11-2018, 17:34:49
Ничего с этим ты не поделаешь.
Звучит не оптимистично (
Почему другие обработчики не перестают работать? Documents_DocumentActivated продолжает работать
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Ривилис от 07-11-2018, 17:45:41
Почему другие обработчики не перестают работать? Documents_DocumentActivated продолжает работать
Это события совершенно разного уровня. Одно - это событие уровня приложения, второе - это событие редактора  (хотя завуалировано как будто это событие документа).
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Пекшев aka Modis от 07-11-2018, 18:06:25
это событие редактора  (хотя завуалировано как будто это событие документа)
На интересную мысль подтолкнули - а если попробовать использовать события Editor.SelectionAdded и Editor.SelectionRemoved?
Единственная проблема, которую пока-что вижу - событие Editor.SelectionAdded при выборе одно отрезка срабатывает порядка 5-6 раз
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Вильдар от 07-11-2018, 18:45:40
А может периодически переподписываться на ImpliedSelectionChanged.  8)
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Пекшев aka Modis от 07-11-2018, 18:54:50
А может периодически переподписываться на ImpliedSelectionChanged.  8)
И в какой-же момент это делать?
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Ривилис от 07-11-2018, 19:36:24
А может периодически переподписываться на ImpliedSelectionChanged.  8)
1. Должен быть баланс подписок/отписок.
2. К сожалению нет адекватного метода для идентификации того подписался ли ты уже или нет.
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Вильдар от 08-11-2018, 08:47:20
Отписаться-подписаться, это же гарантирует одну подписку.
Код - C# [Выбрать]
  1. e.Document.ImpliedSelectionChanged -= Document_ImpliedSelectionChanged;
  2. e.Document.ImpliedSelectionChanged += Document_ImpliedSelectionChanged;
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Пекшев aka Modis от 08-11-2018, 08:57:58
Отписаться-подписаться, это же гарантирует одну подписку.
Код - C# [Выбрать]
  1. e.Document.ImpliedSelectionChanged -= Document_ImpliedSelectionChanged;
  2. e.Document.ImpliedSelectionChanged += Document_ImpliedSelectionChanged;
Ещё раз спрошу - когда это делать?
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Вильдар от 08-11-2018, 09:40:00
Придумать по разному можно.
Например по таймеру.
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Пекшев aka Modis от 08-11-2018, 09:51:38
Например по таймеру
Ну так себе идейка - крутить таймер в автокаде =)
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Дмитрий Загорулькин от 08-11-2018, 13:24:22
Эмпирическим путем мы пришли к выводу, что если в каком-то из обработчиков ImpliedSelectionChanged происходит не отловленная ошибка, то автокад отписывается от ВСЕХ обработчиков событий. Предположительно конечно )
Сталкивался с таким, только у меня были события базы данных. Происходит ошибка в обработчике - события перестают работать, соответственно, приложение начинает работать неадекватно. Причём, что неприятно, пользователь это может заметить далеко не сразу.
А может периодически переподписываться на ImpliedSelectionChanged. 
Есть предположение, что не поможет. Надо проверять.
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Александр Ривилис от 08-11-2018, 13:28:17
Есть предположение, что не поможет. Надо проверять.
Моя интуиция подсказывает это же. Там ломается что-то глубинное, что на уровне подписаться/отписаться уже не сработает. Впрочем возможно зависит от того, какое исключение происходит. Например, возможен вариант, что создаются наборы и не удаляются, а это ограниченный ресурс в AutoCAD (не может их быть больше 128).
Название: Re: Не работает обработка события ImpliedSelectionChanged при ошибке в чужом плагине
Отправлено: Владимир Шу от 08-11-2018, 16:46:54
Off-Topic: показать
а это ограниченный ресурс в AutoCAD (не может их быть больше 128).
7 бит... очень интересная подробность, не знал, что где-то в глубине души автокад семи битный =о).