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

ADN Club => AutoCAD .NET API => Тема начата: Балиев от 19-06-2022, 18:11:40

Название: Транзакция в теле обработчика события.
Отправлено: Балиев от 19-06-2022, 18:11:40
День добрый!
Есть геометрический объект - полилиния (acPoly). Подписываюсь на acPoly.Modified. Обработчик события должен запускать транзакцию для чтения Xrecord, записанной перед созданием полилинии. При попытке запуска транзакции вылетает исключение: "Ссылка на объект не указывает на экземпляр объекта". В чем тут дело? Вроде бы никаких ограничений для программирования обработчиков я не нарушал...
Вот кусок кода:
Извините, вам запрещён просмотр содержимого спойлеров.

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

Заранее благодарен!
Название: Re: Транзакция в теле обработчика события.
Отправлено: Александр Ривилис от 19-06-2022, 18:22:15
В обработчике события модификации нельзя использовать транзакции.
Название: Re: Транзакция в теле обработчика события.
Отправлено: Александр Ривилис от 19-06-2022, 18:27:08
Заодно почитай в документации какие группы можно использовать для Xrecord. Однозначно, что DxfCode.ExtendedDataAsciiString использовать нельзя.
Название: Re: Транзакция в теле обработчика события.
Отправлено: Балиев от 19-06-2022, 19:38:42
В обработчике события модификации нельзя использовать транзакции.
А как, в таком случае, добраться до NamedObjectsDictionaryId без использования GetObject?
Название: Re: Транзакция в теле обработчика события.
Отправлено: avc от 19-06-2022, 19:58:39
Один из вариантов (подходит для серьезной, долгой обработки):
Сохранить где-то флажок, что интересующие вас объекты модифицированы. А всю реальную работу перенести в событие OnIdle
Название: Re: Транзакция в теле обработчика события.
Отправлено: Александр Ривилис от 19-06-2022, 20:01:49
В обработчике события модификации нельзя использовать транзакции.
А как, в таком случае, добраться до NamedObjectsDictionaryId без использования GetObject?
Есть эмуляция транзакции (или просто метод ObjectId.Open). Но нужно быть очень осторожным, чтобы не запустить рекурсию.
Название: Re: Транзакция в теле обработчика события.
Отправлено: Балиев от 19-06-2022, 20:13:03
Сохранить где-то флажок, что интересующие вас объекты модифицированы. А всю реальную работу перенести в событие OnIdle
Идею понял, буду разбираться.
Название: Re: Транзакция в теле обработчика события.
Отправлено: Балиев от 19-06-2022, 20:14:09
Есть эмуляция транзакции (или просто метод ObjectId.Open). Но нужно быть очень осторожным, чтобы не запустить рекурсию.
А использование StartOpenCloseTransaction() ситуацию не улучшит?
Название: Re: Транзакция в теле обработчика события.
Отправлено: Александр Ривилис от 19-06-2022, 20:15:10
А использование StartOpenCloseTransaction() ситуацию не улучшит?
Это и есть эмуляция транзакции, о которой я писал выше.
Название: Re: Транзакция в теле обработчика события.
Отправлено: Дмитрий Загорулькин от 22-06-2022, 15:53:06
Кода-то тоже озадачивался похожим вопросом: https://adn-cis.org/forum/index.php?topic=380.0
Методом проб и ошибок пришёл именно к такому:
Один из вариантов (подходит для серьезной, долгой обработки):
Сохранить где-то флажок, что интересующие вас объекты модифицированы. А всю реальную работу перенести в событие OnIdle
Это событие может происходить немного с задержкой после модификации и визуально может выглядеть как подтормаживание. Но, в отличие от других способов, работает железобетонно.