Событие DocumentActivationChanged в Civil 3D

Автор Тема: Событие DocumentActivationChanged в Civil 3D  (Прочитано 10565 раз)

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте!
Разбираясь с жалобой пользователя на зависание Civil 3D из-за моего приложения, обнаружил неприятную особенность срабатывания в нем события DocumentActivationChanged. Для тестов написал вот такой код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4.  
  5.  
  6. namespace AcadTest
  7. {
  8.     public class DocumentActivationTest
  9.     {
  10.         static ulong count = 0;
  11.         static bool launched = false;
  12.  
  13.         [CommandMethod("RunDocActivateTest")]
  14.         public void Run()
  15.         {          
  16.             DocumentCollection docMgr = Application.DocumentManager;
  17.             if (!launched)
  18.             {
  19.                 docMgr.DocumentActivationChanged += docMgr_DocumentActivationChanged;
  20.                 launched = true;
  21.             }
  22.         }
  23.  
  24.         [CommandMethod("StopDocActivateTest")]
  25.         public void Stop()
  26.         {
  27.             DocumentCollection docMgr = Application.DocumentManager;
  28.             if (launched)
  29.             {
  30.                 docMgr.DocumentActivationChanged -= docMgr_DocumentActivationChanged;
  31.                 launched = false;
  32.             }
  33.         }
  34.  
  35.         [CommandMethod("DocActivateCounterReset")]
  36.         public void CounterReset()
  37.         {
  38.             count = 0;
  39.         }
  40.  
  41.         [CommandMethod("DocActivateCountShow")]
  42.         public void CounterShow()
  43.         {
  44.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  45.             ed.WriteMessage("\nDocumentActivationChanged events: {0}", count);
  46.         }
  47.  
  48.         void docMgr_DocumentActivationChanged(object sender, DocumentActivationChangedEventArgs e)
  49.         {            
  50.             count++;
  51.         }
  52.     }
  53. }
  54.  
Его работу проверил в голом AutoCAD и в Civil 3D. По идее, разницы быть не должно, но она есть! Причем, очень ощутимая.
Вот видеоотчет по тестированию.
AutoCAD: https://screencast.autodesk.com/main/details/41db8829-5277-4d90-89be-c4c054824d86
Civil 3D: https://screencast.autodesk.com/Main/Details/3c90c294-7183-4331-9100-a7c380f55b5e
Получается, что в Civil 3D событие активации документа происходит гораздо чаще! Причем, даже тогда, когда его не должно быть. В видео показан пример - вызов контекстного меню, когда есть выбранные в чертеже объекты. В примере всего несколько объектов, в реальном чертеже у нас их несколько сотен тысяч. А так как у меня происходит некоторая обработка этого события, которая занимает доли секунды, в сумме получается колоссальное зависание (я минут 10 ждал, потом просто завершил процесс acad.exe из диспетчера задач Windows).
Есть, правда, подозрение, что это какое-то мое другое приложение шалит. Поэтому, если у кого-то есть возможность - прошу проверить повторится ли эта ситуация у вас.
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #1 : 24-12-2014, 15:15:17 »
Получается, что в Civil 3D событие активации документа происходит гораздо чаще!
Не проверял, но вполне возможно. Проверь при помощи ARXDBG.
И попробуй объявить класс DocumentActivationTest статическим.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #2 : 24-12-2014, 15:26:25 »
Получается, что в Civil 3D событие активации документа происходит гораздо чаще!
Проверь при помощи ARXDBG.
Точно! Спасибо, постоянно забываю про такую возможность.
Проверил. На каждый чих по десятку событий. Вот, например, копирование объекта:
Команда: _copy
<DOC REACTOR: Чертеж1.dwg> : [Document Lock Mode Will Change]
<DOC REACTOR: Чертеж1.dwg> : [Document Lock Mode Changed] найдено: 1

Текущая настройка:  Режим копирования  = Несколько
Базовая точка или [Смещение/реЖим] <Смещение>:
Вторая точка или [Массив] <использовать для смещения первую точку>:
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
<DOC REACTOR: > : [Document Activation Modified (Activation = False)]
<DOC REACTOR: > : [Document Activation Modified (Activation = True)]
Укажите вторую точку или [Массив/Выход/Отменить] <Выход>:
Статический класс не изменил ситуацию. Вот ведь подстава :(
Скопировал один кружок 5 раз - 406 событий  :o. Похоже, про использование обработки этого события можно забыть.
Команда: DOCACTIVATECOUNTERRESET

Команда: DOCACTIVATECOUNTSHOW

DocumentActivationChanged events: 0
Команда: Задайте противоположный угол или [Линия/РМн-угол/СМн-угол]:
Команда:
Команда:
Команда: _copy найдено: 1

Текущая настройка:  Режим копирования  = Несколько
Базовая точка или [Смещение/реЖим] <Смещение>:
Вторая точка или [Массив] <использовать для смещения первую точку>:
Укажите вторую точку или [Массив/Выход/Отменить] <Выход>:
Укажите вторую точку или [Массив/Выход/Отменить] <Выход>:
Укажите вторую точку или [Массив/Выход/Отменить] <Выход>:
Укажите вторую точку или [Массив/Выход/Отменить] <Выход>:
Укажите вторую точку или [Массив/Выход/Отменить] <Выход>: *Прервано*

Команда: DOCACTIVATECOUNTSHOW

DocumentActivationChanged events: 800
Это даже круче, чем PointMonitor  :D

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #3 : 24-12-2014, 16:28:25 »
Попробовал проверить, как с другими событиями дела обстоят. Добавил обработчиков и получил такой результат:
DocumentActivationChanged events: 392
DocumentActivated events: 2
DocumentToBeActivated events: 2
DocumentToBeDeactivated events: 2
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4.  
  5. namespace AcadTest
  6. {
  7.     public static class DocumentActivationTest
  8.     {
  9.         static ulong changedCount = 0;
  10.         static ulong activatedCount = 0;
  11.         static ulong toBeActivatedCount = 0;
  12.         static ulong toBeDeactivatedCount = 0;
  13.         static bool launched = false;
  14.  
  15.         [CommandMethod("RunDocActivateTest")]
  16.         public static void Run()
  17.         {
  18.             DocumentCollection docMgr = Application.DocumentManager;
  19.             if (!launched)
  20.             {
  21.                 docMgr.DocumentActivationChanged += docMgr_DocumentActivationChanged;
  22.                 docMgr.DocumentActivated += docMgr_DocumentActivated;
  23.                 docMgr.DocumentToBeActivated += docMgr_DocumentToBeActivated;
  24.                 docMgr.DocumentToBeDeactivated += docMgr_DocumentToBeDeactivated;
  25.                 launched = true;
  26.             }
  27.         }
  28.  
  29.         [CommandMethod("DocActivateCountersReset")]
  30.         public static void CounterReset()
  31.         {
  32.             changedCount = 0;
  33.             activatedCount = 0;
  34.             toBeActivatedCount = 0;
  35.             toBeDeactivatedCount = 0;
  36.         }
  37.  
  38.         [CommandMethod("DocActivateCountersShow")]
  39.         public static void CounterShow()
  40.         {
  41.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  42.             ed.WriteMessage("\nDocumentActivationChanged events: {0}", changedCount);
  43.             ed.WriteMessage("\nDocumentActivated events: {0}", activatedCount);
  44.             ed.WriteMessage("\nDocumentToBeActivated events: {0}", toBeActivatedCount);
  45.             ed.WriteMessage("\nDocumentToBeDeactivated events: {0}", toBeDeactivatedCount);
  46.         }
  47.  
  48.         static void docMgr_DocumentActivationChanged(object sender, DocumentActivationChangedEventArgs e)
  49.         {
  50.             changedCount++;
  51.         }
  52.  
  53.         static void docMgr_DocumentActivated(object sender, DocumentCollectionEventArgs e)
  54.         {
  55.             activatedCount++;
  56.         }
  57.  
  58.         static void docMgr_DocumentToBeActivated(object sender, DocumentCollectionEventArgs e)
  59.         {
  60.             toBeActivatedCount++;
  61.         }
  62.  
  63.         static void docMgr_DocumentToBeDeactivated(object sender, DocumentCollectionEventArgs e)
  64.         {
  65.             toBeDeactivatedCount++;
  66.         }
  67.     }
  68. }
Это я переключился с чертежа на другой и обратно и выполнил пару копирований. Я так понимаю, что эти события должны быть взаимосвязаны зависимостями (по количеству):
DocumentActivationChanged = DocumentToBeActivated + DocumentToBeDeactivated
DocumentToBeActivated = DocumentActivated
Может быть, здесь баг?

Отмечено как Решение Дмитрий Загорулькин 24-12-2014, 17:56:25

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #4 : 24-12-2014, 17:37:34 »
Дмитрий. Ты видимо не понял что означает событие DocumentActivationChanged. Оно обертка над AcApDocManagerReactor::documentActivationModified, а это событие наступает не тогда, когда идет переключение между документами, а когда меняется свойство DocumentCollection.DocumentActivationEnabled (обертка над AcApDocManager::disableDocumentActivation и AcApDocManager::enableDocumentActivation, т.е. запрет и разрешение активации документов). Так что это событие может возникать сколько угодно раз в зависимости от кода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #5 : 24-12-2014, 17:56:19 »
Ах вот оно, что, оказывается :)
Спасибо, все теперь понятно!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #6 : 24-12-2014, 17:59:40 »
Спасибо, все теперь понятно!
Теперь вопрос в том какая зараза его так часто переключает. И еще вопрос зачем тебе понадобилось подписываться именно на это событие и делать в нём какие-то достаточно длительные вещи?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #7 : 24-12-2014, 18:18:56 »
Цитировать
Теперь вопрос в том какая зараза его так часто переключает.
Не знаю, но делает она это очень часто.
Цитировать
И еще вопрос зачем тебе понадобилось подписываться именно на это событие и делать в нём какие-то достаточно длительные вещи?
Я решил его использовать для того чтобы отследить переключения между чертежами. Думал, что это совмещенное событие DocumentActivated+DocumentDeactivated. Благодаря Вашему разъяснению, теперь понятно, что это неправильно. Исправил на DocumentActivated - все работает как надо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие DocumentActivationChanged в Civil 3D
« Ответ #8 : 24-12-2014, 18:21:35 »
Исправил на DocumentActivated - все работает как надо.
О! Собственно говоря я к этому и вёл... :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение