еще один новичковый вопрос про Transaction

Автор Тема: еще один новичковый вопрос про Transaction  (Прочитано 4805 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Добрый день!

Есть ли разница между
Код - C# [Выбрать]
  1. db.TransactionManager.StartTransaction();
и
Код - C# [Выбрать]
  1. doc.TransactionManager.StartTransaction();
где то встречается один вариант где то другой.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вроде как при использовании транзакции у документа после фиксации изменений вызывается регенерация графики, а БД - нет. Где-то тут на форуме есть большая тема по транзакциям. Поищите

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
В API Автокада никакой разницы нет. TopTransaction возвращает последнюю открытую транзакцию, как ее не создавай. А вот в "иных" API перемешивать транзакции документа и БД нельзя. Я, для единообразия, всегда обращаюсь к менеджеру транзакций базы данных.

Отмечено как Решение Александр Ривилис 19-10-2018, 15:56:51

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В API Автокада никакой разницы нет.
Есть и достаточно существенная. Если бы ты поисследовал AutoCAD'овские сборки, то увидел бы это. Во-первых, есть два класса TransactionManager:
Autodesk.AutoCAD.DatabaseServices.TransactionManager
Autodesk.AutoCAD.ApplicationServices.TransactionManager
Второй - наследник первого. И второй выполняет дополнительные действия.
Autodesk.AutoCAD.ApplicationServices.TransactionManager.StartTransaction() создаёт не Transaction, а AppTransaction (наследник от Transaction). Существенная разница между AppTransaction и Transaction - в AppTransaction.Commit() кроме Transaction.Commit() выполняется еще и TransactionManager.FlushGraphics();

Код - C# [Выбрать]
  1. internal sealed class AppTransaction : Transaction
  2. {
  3.         private Autodesk.AutoCAD.ApplicationServices.TransactionManager m_mgr = mgr;
  4.  
  5.         public override Autodesk.AutoCAD.DatabaseServices.TransactionManager TransactionManager => m_mgr;
  6.  
  7.         protected internal AppTransaction(IntPtr unmanagedPointer, [MarshalAs(UnmanagedType.U1)] bool autoDelete, Autodesk.AutoCAD.ApplicationServices.TransactionManager mgr)
  8.                 : base(unmanagedPointer, autoDelete)
  9.         {
  10.         }
  11.  
  12.         public sealed override void Commit()
  13.         {
  14.                 Autodesk.AutoCAD.ApplicationServices.TransactionManager obj = (Autodesk.AutoCAD.ApplicationServices.TransactionManager)TransactionManager;
  15.                 base.Commit();
  16.                 obj.FlushGraphics();
  17.         }
  18. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Да, я замечал, что одноименные классы зачем-то сдублированны, но так глубоко не копал. Получается есть еще один повод не использовать менеджер из документа - он на каждом коммите, каждый раз регенить изображение будет. Да?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Получается есть еще один повод не использовать менеджер из документа - он на каждом коммите, каждый раз регенить изображение будет. Да?
Я бы сказал с точностью до наоборот. Конечно если у тебя в огромном цикле создаются/комитятся транзакции, то это не дело. И FlushGraphics - это не регенерация, а отображение изменённых в транзакции объектов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Я как раз и имел ввиду, что вместе с коммитом будут существенные задержки на отображение объектов, которые могут быть в экстремальных случаях больше, чем вся работа внутри транзакции. Так что смысла обращаться к такой транзакции не вижу. Лучше уж явно вызвать перерисовку в самом конце обработчика событий или команды. И то надо еще проверить - во многих случаях Автокад сам все переририсовывает без лишних намеков.
Можно использовать транзакции документа для отдельных простых команд с одной транзакцией. Хотя CommandFlags.Redraw - не то же самое сделает?
Внутри сложных методов, где имеет смысл заводить отдельную транзакцию (если вообще имеет смысл), однозначно предпочтительней не обращаться к документу и к его менеджеру транзакций. Потом такой метод можно будет применить, не открывая документа. Да еще и производительность оказывается выигрывает.

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Помните недавно я в каждом цикле открывал транзакцию менял ширину сегмента полилинии, закрывал транзакцию и по новой.
Поменял на транзакцию бд перерисовка ширины все равно происходит (так и надо). В чем же тогда суть того метода в транзакции документа, который перерисовывает обьекты?
И когда все таки следует использовать каждую транзакцию?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И когда все таки следует использовать каждую транзакцию?
Когда хочешь тогда и используй. А можешь вообще не использовать, как я показывал. Разницу между транзакциями я уже объяснял. В твоём случае скорее всего AutoCAD вызывает неявно FlushGraphics в момент, когда ты запрашиваешь очередной сегмент (т.е. при вызове Editor.GetXXX)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
так все неоднозначно..
Спасибо!