Транзакция в теле обработчика события.

Автор Тема: Транзакция в теле обработчика события.  (Прочитано 2617 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
День добрый!
Есть геометрический объект - полилиния (acPoly). Подписываюсь на acPoly.Modified. Обработчик события должен запускать транзакцию для чтения Xrecord, записанной перед созданием полилинии. При попытке запуска транзакции вылетает исключение: "Ссылка на объект не указывает на экземпляр объекта". В чем тут дело? Вроде бы никаких ограничений для программирования обработчиков я не нарушал...
Вот кусок кода:
Извините, вам запрещён просмотр содержимого спойлеров.

74-ая строка: подписка на событие.
87-ая строка: запуск транзакции.

Заранее благодарен!

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Заодно почитай в документации какие группы можно использовать для Xrecord. Однозначно, что DxfCode.ExtendedDataAsciiString использовать нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
В обработчике события модификации нельзя использовать транзакции.
А как, в таком случае, добраться до NamedObjectsDictionaryId без использования GetObject?

Онлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Один из вариантов (подходит для серьезной, долгой обработки):
Сохранить где-то флажок, что интересующие вас объекты модифицированы. А всю реальную работу перенести в событие OnIdle

Отмечено как Решение Балиев 19-06-2022, 20:17:19

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

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

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Сохранить где-то флажок, что интересующие вас объекты модифицированы. А всю реальную работу перенести в событие OnIdle
Идею понял, буду разбираться.

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Есть эмуляция транзакции (или просто метод ObjectId.Open). Но нужно быть очень осторожным, чтобы не запустить рекурсию.
А использование StartOpenCloseTransaction() ситуацию не улучшит?

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Кода-то тоже озадачивался похожим вопросом: https://adn-cis.org/forum/index.php?topic=380.0
Методом проб и ошибок пришёл именно к такому:
Один из вариантов (подходит для серьезной, долгой обработки):
Сохранить где-то флажок, что интересующие вас объекты модифицированы. А всю реальную работу перенести в событие OnIdle
Это событие может происходить немного с задержкой после модификации и визуально может выглядеть как подтормаживание. Но, в отличие от других способов, работает железобетонно.