Перестает работать функция (обработчик событий)

Автор Тема: Перестает работать функция (обработчик событий)  (Прочитано 29488 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Что-то я принципиальной разницы с исходным вариантом не увидел :)
В методе Initialize 100% надо делать проверку AcApp.DocumentManager.MdiActiveDocument на null.
Не увидел, где эти объекты создаются:
Код - C# [Выбрать]
  1. public static ObjectIdCollection ObjCol;
  2. public static List<string> AcadCommands;
И я бы не стал для своей коллекции ObjectId использовать ObjectIdCollection. Тот же List<ObjectId> гораздо удобнее.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Что-то я принципиальной разницы с исходным вариантом не увидел
А вот принципиальная разница есть! И еще какая! Но пока все толком не протестирую - точно не скажу
Не увидел, где эти объекты создаются:
Для вопроса это было не суть важно) Где они создаются - стерто
И я бы не стал для своей коллекции ObjectId использовать ObjectIdCollection. Тот же List<ObjectId> гораздо удобнее.
Начинал делать это очень давно. Сейчас уже и не скажу почему взял ObjectIdCollection. Скорее от отсутствия опыта) В принципе - особо роли не играет - Linq'ом пользоваться не приходится

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
В общем - я человек ленивый)) И разбираться с проблемами документов мне не захотелось
нет ты трудоголик, не любящий отдыхать в выходные и не любящий спать по ночам выискивая ошибки, сделанные по лени!

 
Ты можешь несколько раз подписать функции, и они будут срабатывать по несколько раз.


Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
В общем - я человек ленивый)) И разбираться с проблемами документов мне не захотелось
нет ты трудоголик, не любящий отдыхать в выходные и не любящий спать по ночам выискивая ошибки, сделанные по лени!

 
Ты можешь несколько раз подписать функции, и они будут срабатывать по несколько раз.

...не успевал дописать, кипишь на работе. Так вот
в DocumentManager_DocumentActivated() ты к примеру  подписываешь
e.Document.Database.ObjectAppended += CallBack_ObjectAppended;

В случае, если ты попереключаешься между 2 документами туда-сюда три раза, произойдут события DocumentActivated и ты попросишь программу три раза вызывать функцию CallBack_ObjectAppended при добавлении объекта в чертеже. И в итоге получишь тормоза при добавлении объекта, и возможно сбой логики программы, в зависимости от того, что делают твои функции.

не ленись на событиях, их сложно отлаживать.))))

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В случае, если ты попереключаешься между 2 документами туда-сюда три раза, произойдут события DocumentActivated и ты попросишь программу три раза вызывать функцию CallBack_ObjectAppended при добавлении объекта в чертеже. И в итоге получишь тормоза при добавлении объекта, и возможно сбой логики программы, в зависимости от того, что делают твои функции.
Кхм....... надо потестить

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
...не успевал дописать, кипишь на работе. Так вот
в DocumentManager_DocumentActivated() ты к примеру  подписываешь
e.Document.Database.ObjectAppended += CallBack_ObjectAppended;

В случае, если ты попереключаешься между 2 документами туда-сюда три раза, произойдут события DocumentActivated и ты попросишь программу три раза вызывать функцию CallBack_ObjectAppended при добавлении объекта в чертеже. И в итоге получишь тормоза при добавлении объекта, и возможно сбой логики программы, в зависимости от того, что делают твои функции.

не ленись на событиях, их сложно отлаживать.))))
Поэтому, я всегда пишу так:
e.Document.Database.ObjectAppended -= CallBack_ObjectAppended;
e.Document.Database.ObjectAppended += CallBack_ObjectAppended;

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дмитрий Загорулькин, я когда читал твой предыдущий ответ точно о том-же подумал: сделать сначала отключение, потов подключение. Теперь бы найти время все это применить и потестить)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дмитрий Загорулькин, даже не учитывая вышеизложенное (что события сработают по несколько раз) - второй вариант, который я описал выше, не сработал - со временем все опять перестало работать ((

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
В блоки catch добавлял вывод сообщений?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В блоки catch добавлял вывод сообщений?
В том-то и дело - нужно еще найти куда этот try catch расположить! В том, коде, что я пропустил - там есть. Ошибок не возникает
Остается вариант - расположить try catch вообще везде и затестить ))

Думаю, сегодня верну первый вариант (который в первом сообщении), внесу несколько изменений и буду продолжать тестировать. Второй вариант более "тяжелый", т.к. чаще приходится читать расширенные данные

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Скорее всего, достаточно во все уже имеющиеся блоки добавить, а не новых расставить. AutoCAD настолько нежен, что при любом исключении валится. Иногда, правда, просто предупреждение выдаст - мол: "имеется ошибка, продолжить?". В любом случае, тихо такие события не проходят. А вот если это все в try-catch, то краха не происходит, но события уже работать перестают. Тут только остается понять в каком блоке это происходит и при каких манипуляциях, ставить туда точку остановки при отладке, воспроизводить ситуацию и смотреть что там не так.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дмитрий Загорулькин, ты немного не понял (или я не понял) - в try catch у меня не "тихое проглатывание". Если ошибка - выскакивает соответствующее окошко. Так вот в имеющихся try catch ошибок нет. Вот и придется новых натыкивать (хотя-бы временно), чтобы хотя-бы найти где происходит сбой. Потом уже разбираться - почему

И главное - другие пользователи не сообщают об этом. Такое ощущение, что я один работаю с несколькими документами и запущенной функцией =) Ну или просто ленивые - не пишут

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Если выскакивает окошко и точно известна последовательность действий, приводящих к ошибке - тогда совсем все просто должно быть. Запускаем приложение в отладке и добиваемся возникновения ошибки. Окошко об ошибке должно появится информативное, с указанием точного места возникновения ошибки - вплоть до номера строки в файле с кодом.
А пользователи очень часто игнорируют такие вещи. Откуда им знать, из-за чего возникла ошибка. AutoCAD и сам по себе фаталит иногда.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем - так я ничего и не добился. Пробовал все различные варианты, почти все оборачивал в try catch - безрезультатно. Просто после (НЕИЗВЕСТНЫХ) действий при работе автокада перестают работать обработчики событий ДОКУМЕНТА. Помогает полное закрытие документа с последующим открытием. Никаких ошибок не ловится
Выделил два слова
- неизвестных - думал, что проблема в переключении между чертежами, но сегодня произошел сбой, а работал я только с одним чертежом
- документа - сбой происходит только в одном документе. Если перейти в другой, где активны те-же события - там работает все

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
В общем - так я ничего и не добился. Пробовал все различные варианты, почти все оборачивал в try catch - безрезультатно. Просто после (НЕИЗВЕСТНЫХ) действий при работе автокада перестают работать обработчики событий ДОКУМЕНТА. Помогает полное закрытие документа с последующим открытием. Никаких ошибок не ловится
Выделил два слова
- неизвестных - думал, что проблема в переключении между чертежами, но сегодня произошел сбой, а работал я только с одним чертежом
- документа - сбой происходит только в одном документе. Если перейти в другой, где активны те-же события - там работает все
не удалось полениться?))))
try catch врятли поможет, т.к. ошибка скорее касается всего времени выполнения.
Открывай поток и пиши информацию о  событиях, на которые подписываешься в текстовый файл и анализируй.
Ищи нарушение очередности или двойное срабатывание, может что еще найдешь.