Ошибка при использовании WblockCloneObjects

Автор Тема: Ошибка при использовании WblockCloneObjects  (Прочитано 29013 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #45 : 11-02-2016, 08:18:28 »
Буду пробовать все описанные выше варианты. Во вложении картинка с ошибкой при работе кода в посте 39. Проверил код на Autocad MEP 2012 (64) под Win8. Тоже самое происходит, но побольше блоков копирует перед ошибкой.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #46 : 11-02-2016, 08:51:55 »
Вообщем по пунктам:
1. Предложение Александра не помогло.
2. Предложение Дмитрия  №1. Не помогло.
3. Предложение Дмитрия  №2. Не помогло.
4. Предложение Дмитрия  №3. См. пункт 1.
5. Предложение Дмитрия №4. Добавил mapping.Dispose после WblockCloneObjects. Пока вылечило. Ошибка не воспроизводится. На AutoCal MEP 2012 х64 под Win8 и на Autocad MEP 2011 х64 под Win7 64.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #47 : 11-02-2016, 09:06:39 »
2. Попробуй убрать строки:
HostApplicationServices.WorkingDatabase = SourceDb;
HostApplicationServices.WorkingDatabase = ActiveDb;
Для цели вставки блоков, переключать не нужно.
Хотел уточнить в каком случае тогда нужно переключать? Я предполагал если код работает с такой-то базой, то я делаю ее текущей, конечно в случае если идет работа с несколькими базами.

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Ошибка при использовании WblockCloneObjects
« Ответ #48 : 11-02-2016, 09:07:51 »
Добавил mapping.Dispose
На это и подозревал.
Краткий ответ таков: "увы, но для всех объектов автокада нужно вызывать Dispose", кроме объектов, управляемых транзакцией.

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Ошибка при использовании WblockCloneObjects
« Ответ #49 : 11-02-2016, 09:20:55 »
Хотел уточнить в каком случае тогда нужно переключать? Я предполагал если код работает с такой-то базой, то я делаю ее текущей, конечно в случае если идет работа с несколькими базами.
В большинстве сценариев работы это не требуется, просто взяли объект, скопировали и все.
И у меня пока не встречалось таких задач.
Но некоторые команды работают по своему, например SelectCrossingPolygon.
Она работает в пределах текущего вида. Неудобно, но пока идеальной альтернативы нет.
И если вдруг понадобиться применить SelectCrossingPolygon к 2м базам данных "одновременно", тогда придется переключать текущие базы, документы, виды, зуммировать и т.д.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #50 : 11-02-2016, 09:25:38 »
DirectCast(SourceDb.BlockTableId.Open(OpenMode.ForRead), BlockTable)
Александр метод Open помечается как устаревший (For advanced use only. Use GetObject instead). Это не приведет к каким-нибудь сюрпризам?

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #51 : 11-02-2016, 09:56:51 »
DirectCast(SourceDb.BlockTableId.Open(OpenMode.ForRead), BlockTable)
Александр метод Open помечается как устаревший (For advanced use only. Use GetObject instead). Это не приведет к каким-нибудь сюрпризам?
Нет. Никаких сюрпризов не будет. И будет работать быстрее. Но его очень желательно использовать в блоке Using, а если нет, то не забывать принудительно вызывать его метод Close. Иначе развалишь AutoCAD. Не зря написано: For advanced use only
5. Предложение Дмитрия №4. Добавил mapping.Dispose после WblockCloneObjects. Пока вылечило. Ошибка не воспроизводится. На AutoCal MEP 2012 х64 под Win8 и на Autocad MEP 2011 х64 под Win7 64.
Похоже на элементарную утечку памяти. Но у меня она не воспроизвелась - возможно памяти было достаточно, возможно причина в том, что у меня чистый AutoCAD, а не MEP. Может быть если зациклить твой код для вставки тысячи блоков это бы воспроизвелось. В действительности при  WblockCloneObjects mapping заполняется часто достаточно большим количеством ObjectId объектов (в твоём случае это как минимум ObjectId всех элементы блоков, слоёв, типов линий, динамическими вещами и т.д.). Ну и если это делается многократно, то утечка будет. Короче говоря Привалов Дмитрий абсолютно прав, что всё, что создал нужно чистить после того как ни ты ни AutoCAD это уже не использует. Можно было при помощи блока Using.
2. Попробуй убрать строки:
HostApplicationServices.WorkingDatabase = SourceDb;
HostApplicationServices.WorkingDatabase = ActiveDb;
Для цели вставки блоков, переключать не нужно.
Хотел уточнить в каком случае тогда нужно переключать? Я предполагал если код работает с такой-то базой, то я делаю ее текущей, конечно в случае если идет работа с несколькими базами.
Переключать нужно тогда, когда AutoCAD сам не знает откуда ему брать ссылки на объекты. Например, для примитива DBText где взять ObjectId для текстового стиля по-умолчанию, или ObjectId для слоя. По поводу:
SelectCrossingPolygon
это отношения к делу не имеет, т.к. тут важно не WorkingDatabase, а ActiveDocument.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Ошибка при использовании WblockCloneObjects
« Ответ #52 : 11-02-2016, 10:02:09 »
Похоже на элементарную утечку памяти. Но у меня она не воспроизвелась - возможно памяти было достаточно, возможно причина в том, что у меня чистый AutoCAD, а не MEP.

Вопрос гораздо серёзнее, и ошибка комплексная. Отправлю инфу в личку, т.к. ее много, она не оформлена и явно не для этой темы.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #53 : 11-02-2016, 10:39:27 »
Александр, Дмитрий спасибо за помощь. Плюсики я нажал :).

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #54 : 11-02-2016, 11:52:13 »
Отправлю инфу в личку, т.к. ее много, она не оформлена и явно не для этой темы.
Создавай тему - обсудим. В данном случае - это явная утечка памяти, т.к. mapping - это обертка для коллекция пар объектов, для которой Dispose вызывает освобождение памяти коллекции. От потока это не зависит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение