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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Добрый день!
Ниже функция которая вытягивает блок из нужного файла. На одном компе возникает ошибка "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена". Не могу понять в чем причина, у меня на компе все работает.
Код - vb.net [Выбрать]
  1. Friend Shared Function AddBlockRecordToActiveDatabase(ByVal BlockName As String, ByVal path As String) As Boolean
  2.         Dim key As Boolean = False
  3.         Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  5.         Dim PathString As String = GetPath(path)
  6.         ed.WriteMessage(vbCrLf & "Путь файла=" & PathString & vbCrLf)
  7.         ed.WriteMessage(vbCrLf & "Имя блока=" & BlockName & vbCrLf)
  8.         If File.Exists(PathString) Then
  9.             '   Using doclock As DocumentLock = doc.LockDocument()
  10.             Using SourceDb As New Database(False, True)
  11.                 Try
  12.                     SourceDb.ReadDwgFile(PathString, System.IO.FileShare.Read, True, "")
  13.             ed.WriteMessage(vbCrLf & "Шаг 1" & vbCrLf)
  14.                     Dim RequestedBlockIds As New ObjectIdCollection()
  15.                     ed.WriteMessage(vbCrLf & "Шаг 2" & vbCrLf)
  16.                     Using acTrans As Transaction = SourceDb.TransactionManager.StartTransaction()
  17.                         ed.WriteMessage(vbCrLf & "Шаг 3" & vbCrLf)
  18.                         Dim bt As BlockTable = DirectCast(acTrans.GetObject(SourceDb.BlockTableId, OpenMode.ForRead), BlockTable)
  19.                         If bt.Has(BlockName) Then
  20.                             ed.WriteMessage(vbCrLf & "Шаг 4" & vbCrLf)
  21.                             Dim btr As BlockTableRecord = DirectCast(acTrans.GetObject(bt(BlockName), OpenMode.ForRead), BlockTableRecord)
  22.                             ed.WriteMessage(vbCrLf & "Шаг 5" & vbCrLf)
  23.                             RequestedBlockIds.Add(btr.ObjectId)
  24.                             ed.WriteMessage(vbCrLf & "Шаг 6" & vbCrLf)
  25.                             'btr.Dispose()
  26.                             key = True
  27.                         End If
  28.                         ed.WriteMessage(vbCrLf & "Шаг 7" & vbCrLf)
  29.                         '  bt.Dispose()
  30.                         acTrans.Commit()
  31.                     End Using
  32.                     If RequestedBlockIds.Count > 0 Then
  33.                         ed.WriteMessage(vbCrLf & "Шаг 8" & vbCrLf)
  34.                         Dim ActiveDb As Database = doc.Database
  35.                         ed.WriteMessage(vbCrLf & "Шаг 9" & vbCrLf)
  36.                         Dim mapping As New IdMapping()
  37.                         ed.WriteMessage(vbCrLf & "Шаг 10" & vbCrLf)
  38.                         SourceDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, False)
  39.                         ed.WriteMessage(vbCrLf & "Шаг 11" & vbCrLf)
  40.                     End If
  41.                     ed.WriteMessage(vbCrLf & "Шаг 12" & vbCrLf)
  42.                     '   RequestedBlockIds = Nothing
  43.                 Catch ex As System.Exception
  44.                     ed.WriteMessage("Ошибка: Поврежден файл " & PathString & vbCrLf)
  45.                     ed.WriteMessage(vbCrLf & ex.Message & path & vbCrLf)
  46.                     ed.WriteMessage(vbCrLf & "Шаг 13" & vbCrLf)
  47.                     key = False
  48.                 End Try
  49.             End Using
  50.             ed.WriteMessage(vbCrLf & "Шаг 14" & vbCrLf)
  51.             'SourceDb.Dispose()
  52.             ed.WriteMessage(vbCrLf & "Шаг 15" & vbCrLf)
  53.             '    End Using
  54.             ed.WriteMessage(vbCrLf & "Шаг 16" & vbCrLf)
  55.             Return key
  56.         Else
  57.             ed.WriteMessage("Ошибка: Отсутствует файл " & PathString & vbCrLf)
  58.             Return key
  59.         End If
  60.     End Function
   

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Вроде поправил.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вроде поправил.
Да. С форматированием теперь всё нормально. Теперь пара вопросов:
1) Откуда уверенность, что ошибка возникает в WblockCloneObjects?
2) Что печаталось до этого сообщения?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Зачем отключили блокировку документа?

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Уверенность связанна с записями ниже. Получается вот, что (до 10 шага все нормально, ниже 13 уже ничего не пишет, между 10 и 13 тоже ничего не пишет):
Шаг 10
Ошибка: Поврежден файл X:\Supp\Support\Cables\Data\База блоков.dwg
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том,
что другая память повреждена.База блоков.dwg
Шаг 13

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Александр Пекшев aka Modis,
Это были эксперименты. Блокировка на ошибку не влияет.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Поменяй SourceDb.WblockCloneObjects на ActiveDb.WblockCloneObjects
2) Поэкспериментируй с заменой DuplicateRecordCloning.Ignore на DuplicateRecordCloning.Replace
3) Поставь блокировку doc перед WblockCloneObjects
4) убери TRY/CATCH, чтобы увидеть системную ошибку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Может это связано как-то с размером файла? У меня файл получается больше 10мб?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Может это связано как-то с размером файла? У меня файл получается больше 10мб?
Это вряд-ли связано с файлом-источник. Если вы при отлове ошибки написали "Файл испорчен", то это еще не истина )

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #10 : 09-02-2016, 13:20:10 »
Может это связано как-то с размером файла? У меня файл получается больше 10мб?
Нет. Если ты вручную средствами AutoCAD можешь вставить этот блок, то и через API это должно работать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #11 : 09-02-2016, 13:21:06 »
Если вы при отлове ошибки написали "Файл испорчен", то это еще не истина )
100%. Поэтому я и предложил убрать TRY/CATCH.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #12 : 09-02-2016, 13:23:06 »
Volody1983
Убедись, что исходный файл (откуда ты берёшь блок) нормальный. Для этой цели попробуй открыть его в AutoCAD через команду _RECOVER, а потом выполни _AUDIT.

P.S.: Кстати ошибка может быть совсем в другом месте кода. Просто она проявляется именно в этот момент, но память у тебя испорчена раньше.
Поэтому тебе придётся сделать тестовую команду с минимальным кодом для проверки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #13 : 09-02-2016, 13:29:33 »
Александр Ривилис,
Убеждался и с помощью _audit и всеми другими возможными вариантами. На эту фразу "ed.WriteMessage("Ошибка: Поврежден файл " & PathString & vbCrLf)" не обращайте внимание, она для пользователей.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при использовании WblockCloneObjects
« Ответ #14 : 09-02-2016, 13:30:54 »
Ну попробуй хотя-бы для начала ex.Message заменить на ex.StackTrace - там вроде пишется номер строки в которой возникла ошибка
2) Поэкспериментируй с заменой DuplicateRecordCloning.Ignore на DuplicateRecordCloning.Replace
И это в первую очередь пробуй

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #15 : 09-02-2016, 13:31:24 »
не обращайте внимание, она для пользователей.
Я и не обращаю внимания, но она мне мешает увидеть трассировку и код ошибки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #16 : 09-02-2016, 13:37:56 »
Более полная ошибка выглядит так:
"************** Текст исключения **************
System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в Autodesk.AutoCAD.DatabaseServices.Transaction.DeleteUnmanagedObject()
   в Autodesk.AutoCAD.Runtime.DisposableWrapper.!DisposableWrapper()
   в Autodesk.AutoCAD.Runtime.DisposableWrapper.Dispose(Boolean )
   в Autodesk.AutoCAD.Runtime.DisposableWrapper.Dispose()
   в Sb.Plugin.InsertBlockFromDataBaseJig.BlockJigCmd(SpecifficationDataObject BlockData, Form _Form)
   в Sb.Plugin.InsertBlkRefFromDataBase.ButtonInsertBlock_Click(Object sender, EventArgs e)
   в System.Windows.Forms.Control.OnClick(EventArgs e)
   в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ButtonBase.WndProc(Message& m)
   в System.Windows.Forms.Button.WndProc(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)"

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #17 : 09-02-2016, 13:41:56 »
1) Ты ни слова не сказал, что вызываешь это код из формы. Причем неясно это форма модальная или нет. В любом случае документ следует блокировать.
2) Ошибка возникает при освобождении транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #18 : 09-02-2016, 13:45:59 »
Извиняюсь форма модальная (WinForm, вызываю с помощью ShowModalDialog).
Еще entityJig используется, но до него не успевает доходить. Хотя опять же у меня на компе все работает без ошибок.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при использовании WblockCloneObjects
« Ответ #19 : 09-02-2016, 13:47:49 »
в Sb.Plugin.InsertBlockFromDataBaseJig.BlockJigCmd(SpecifficationDataObject BlockData, Form _Form)
   в Sb.Plugin.InsertBlkRefFromDataBase.ButtonInsertBlock_Click(Object sender, EventArgs e)
Еще entityJig используется, но до него не успевает доходить
Эммммм... А ошибка вроде гласит об обратном)

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #20 : 09-02-2016, 13:50:02 »
Александр Пекшев aka Modis,
Класс с jig наз-ся JigBlock. До его вызова не доходит спотыкается при копировании блока. Т.е. если блок копируется успешно вот тогда JigBlock запускается, если нет то выходим из процедуры.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при использовании WblockCloneObjects
« Ответ #21 : 09-02-2016, 13:51:35 »
Volody1983, покажите нам Sb.Plugin.InsertBlockFromDataBaseJig.BlockJigCmd(SpecifficationDataObject BlockData, Form _Form) и Sb.Plugin.InsertBlkRefFromDataBase.ButtonInsertBlock_Click(Object sender, EventArgs e)
Возможно ошибка даже в другом методе происходит

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #22 : 09-02-2016, 14:01:24 »
Хотя опять же у меня на компе все работает без ошибок.
1) Чертеж один и тот же на обоих PC?
2) Одна и таже версия AutoCAD (и какая?) и Windows?
3) Одна и таже версия .NET?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #23 : 09-02-2016, 14:06:07 »
Александр Пекшев aka Modis,
Там ничего нет. В ButtonInsertBlock_Click запускается BlockJigCmd. А BlockJigCmd хлопается на копировании блока.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #24 : 09-02-2016, 14:06:36 »
Александр Ривилис,
1) Да.
2) Да. Autocad MEP 2011 64, Win 7 64
3) Как проверить версию .net на другом компе?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #25 : 09-02-2016, 14:17:33 »
Повторюсь:
1) Поменяй SourceDb.WblockCloneObjects на ActiveDb.WblockCloneObjects
2) Поэкспериментируй с заменой DuplicateRecordCloning.Ignore на DuplicateRecordCloning.Replace
3) Поставь блокировку doc перед WblockCloneObjects
4) убери TRY/CATCH, чтобы увидеть системную ошибку. (сделано)
Если это не поможет - делай простейшую тестовую команду на основе этого: http://adndevblog.typepad.com/autocad/2012/05/insert-block-from-a-different-dwg-using-net-.html
Явно укажи в ней имя файла и имя блока. Проверь её работоспособность. Не забывай передавать dll-файл в конфигурации Release.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #26 : 09-02-2016, 14:34:03 »
Александр Ривилис,
Александр, а можно для понимания пояснить 1), 2). Т.к. опять же на моем компе работает и так и так.
Вообщем выяснилось следующее убрал файл с блоками с виртуального диска (который создается командой subst) на локальный и все заработало как часы.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #27 : 09-02-2016, 14:39:22 »
Александр, а можно для понимания пояснить 1), 2). Т.к. опять же на моем компе работает и так и так.
1) Этот метод следует использовать с той базой, над которой будет выполняться модификация
2) DuplicateRecordCloning.Replace заменяет одноимённые записи (например, имя блока, имя слоя, имя типа линии и т.д.)
Вообщем выяснилось следующее убрал файл с блоками с виртуального диска на локальный и все заработало как часы.
Возможно это проблема виртуального диска, хотя...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #28 : 09-02-2016, 14:43:46 »
Все-таки где-то сидит косяк. После вставки сотни блоков вылезла такая же ошибка. Но похоже ошибка все-таки где-то ниже.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #29 : 09-02-2016, 14:46:52 »
Возможно это побочный эффект того, что это не чистый AutoCAD, а MEP. Тоже бывает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #30 : 09-02-2016, 18:57:40 »
Еще вопрос по поводу к какой базе все-таки применять метод WblockCloneObjects. Вот например здесь пишут так http://through-the-interface.typepad.com/through_the_interface/2006/08/breaking_it_dow.html. А вот здесь по другому http://adndevblog.typepad.com/autocad/2012/05/insert-block-from-a-different-dwg-using-net-.html . Из документации все ясно кроме как к какой базе правильно применять метод. У меня работают оба варианта.

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

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

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Ошибка при использовании WblockCloneObjects
« Ответ #32 : 10-02-2016, 10:02:24 »
Вообщем выяснилось следующее убрал файл с блоками с виртуального диска (который создается командой subst) на локальный и все заработало как часы.
SourceDb.ReadDwgFile не загружает файл в память. А делает отложенную загрузку по требованию.
Поэтому нужно лезть в тонкости виртуальных дисков. Вдруг во время работы отваливается, меняет права доступа или не постоянен в памяти. Последнее сделает виртуальный диск полностью не пригодным для работы с ReadDwgFile. Как вариант можешь попробовать открыть файл, для записи, тогда может быть проблема уйдет.

Все-таки где-то сидит косяк. После вставки сотни блоков вылезла такая же ошибка. Но похоже ошибка все-таки где-то ниже
ReadDwgFile обращается к RealDwg, который является потоко не безопасным, а ты вызываешь его 100 раз. Постарайся минимизировать количество вызовов ReadDwgFile в коде, например подгрузить все нужные блоки сразу в чертеж, а не по мере необходимости.

Но возможно, как подсказал Александр причина порчи памяти в другой части кода, а WblockCloneObjects просто на нее наталкивается.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #33 : 10-02-2016, 11:22:06 »
Самое плохое в том, что на моем компе не удается никак отловить ни в релизной сборке, ни в другой. Вставив 954 блока в одном сеансе, при этом не менее 100 блоков различных вставлял через realdwgfile в цикле. Засомневался даже, что ошибка в коде. Тут задумался, может файл подкачки как-то влияет? Программа стоит на том же диске, что и файл подкачки. И по версии .net хотел уточнить, программа скомпилирована в 3.5. Правильно я понимаю, что версия net с которой работает автокад и соответственно моя сборка можно посмотреть acad.exe.config?

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Ошибка при использовании WblockCloneObjects
« Ответ #34 : 10-02-2016, 16:04:55 »
Самое плохое в том, что на моем компе не удается никак отловить ни в релизной сборке, ни в другой.
можно добавить Dispose() после использования объектов везде, где можно, кроме редактора и документа.
у тебя даже есть комментированные строки.
Когда транзакция закроется, она вызовет Dispose всех своих объектов.
Но ты можешь сделать это сам, и если повезет ты увидишь ошибку dispose раньше.
но далеко не факт, что ошибка в данной части кода.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #35 : 10-02-2016, 17:18:27 »
Засунул Readdwgfile в событие Load формы. Dispose новой базы засунул в событие Close. Стало гораздо стабильнее. Но стало иногда ловится EWrongDataBase.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #36 : 10-02-2016, 19:09:10 »
Dispose новой базы засунул в событие Close
Если создание базы была в Using, то никакой Close не нужен. Более того он вреден.
Но стало иногда ловится EWrongDataBase.
Из документации: eWrongDatabase -- if the owners are not from the same database в WblockCloneObjects. Т.е. как раз возможен случай, когда этот метод вызывается для неправильной базы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Ошибка при использовании WblockCloneObjects
« Ответ #37 : 10-02-2016, 20:10:53 »
Засунул Readdwgfile в событие Load формы. Dispose новой базы засунул в событие Close. Стало гораздо стабильнее. Но стало иногда ловится EWrongDataBase.
не стоит не то и не туда засовывать. Сперва, как предложил Александр, создай тест, где будет выполняться загрузка без всяких форм.
Если это не поможет - делай простейшую тестовую команду на основе этого: http://adndevblog.typepad.com/autocad/2012/05/insert-block-from-a-different-dwg-using-net-.html
Явно укажи в ней имя файла и имя блока. Проверь её работоспособность. Не забывай передавать dll-файл в конфигурации Release.

это позволит узнать, проблема в  функции ReadDwgFile, или в чем-то еще.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #38 : 10-02-2016, 20:15:07 »
Александр я имею ввиду так:

Код - vb.net [Выбрать]
  1. Public Class InsertBlkRefFromDataBaseForm
  2.    Private SourceDb As New Database(False, True)
  3.    Private Sub InsertBlkRefFromDataBaseForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.    SourceDb.ReadDwgFile("Путь к файлу", System.IO.FileShare.Read, True, "")
  5.     End Sub
  6.  
  7. Private Sub InsertBlkRefFromDataBaseForm_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
  8.            SourceDb.Dispose()
  9.     End Sub
  10.  
  11. End Class
В код еще добавил переключалку текущей базы  HostApplicationServices.WorkingDatabase = база с которой работаем. При таком варианте ощутимо быстрее, т.к. один раз вызывается readdwgfile, а на его вызов тратится существенное время.

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #39 : 10-02-2016, 21:54:23 »
Попробовал докопаться до истины. Первое что сделал создал тест файл с 300 блоков на основе окружностей, без атрибутов и не димамические. Код который ниже отрабатывал эти блоки на основе окружности на ура. Дальше решил со своими блоками потестировать (с атрибутами и динамические). Вообщем код ниже на файле во вложении при запуске команды test в релизной сборке стабильно рушит автокад (тестировал в Autocad MEP 2011 х64 под Win 7 64). В дебаггере по крайней мере раз 5 на чистых файлах отработало без ошибки.
Код - vb.net [Выбрать]
  1.      <CommandMethod("Test")> _
  2.       Public Sub RunWblockCloneObjects()
  3.             Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  4.             Dim db As Database = doc.Database
  5.             Dim ed As Editor = doc.Editor
  6.             Dim _List As New List(Of String)
  7.             _List.Add("Клеммники.281-657")
  8.             _List.Add("Клеммники.281-663")
  9.             _List.Add("Клеммники.282-681")
  10.             _List.Add("Клеммники.282-684")
  11.             _List.Add("Клеммники.284-687")
  12.             _List.Add("Клеммники.870-551")
  13.             _List.Add("Клеммники.870-557")
  14.             _List.Add("Клеммники.870-567")
  15.             _List.Add("Сх.281-657")
  16.             _List.Add("Сх.281-663")
  17.             _List.Add("Сх.282-681")
  18.             _List.Add("Сх.282-684")
  19.             _List.Add("Сх.284-681")
  20.             _List.Add("Сх.284-687")
  21.             _List.Add("Сх.870-551")
  22.             _List.Add("Сх.870-557")
  23.             _List.Add("Сх.870-567")
  24.             _List.Add("Сх.Одноярусный_кл_3проводный")
  25.             For Each _Name In _List
  26.  
  27.                 AddListBlockRecordToActiveDatabase("X:\TestBlk.dwg", _Name)
  28.             Next
  29.         End Sub
  30.         'Вытягивает нужные блоки из внешнего файла если их нет в текущем
  31.         Private Sub AddListBlockRecordToActiveDatabase(ByVal PathString As String, ByVal BlkName As String)
  32.             Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  33.             Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  34.             Dim ActiveDb As Database = doc.Database
  35.             Using SourceDb As New Database(False, True)
  36.  
  37.                 SourceDb.ReadDwgFile(PathString, System.IO.FileShare.Read, True, "")
  38.                 Dim RequestedBlockIds As New ObjectIdCollection()
  39.                 HostApplicationServices.WorkingDatabase = SourceDb
  40.                 Using acTrans As Transaction = SourceDb.TransactionManager.StartTransaction()
  41.                     Dim bt As BlockTable = DirectCast(acTrans.GetObject(SourceDb.BlockTableId, OpenMode.ForRead), BlockTable)
  42.                     If bt.Has(BlkName) Then
  43.                         Dim btr As BlockTableRecord = DirectCast(acTrans.GetObject(bt(BlkName), OpenMode.ForRead), BlockTableRecord)
  44.                         RequestedBlockIds.Add(btr.ObjectId)
  45.                     End If
  46.                     acTrans.Commit()
  47.                 End Using
  48.                 HostApplicationServices.WorkingDatabase = ActiveDb
  49.                 If RequestedBlockIds.Count > 0 Then
  50.                     Dim mapping As New IdMapping()
  51.                     Using doclock As DocumentLock = doc.LockDocument()
  52.                         ActiveDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, False)
  53.                     End Using
  54.                 End If
  55.  
  56.             End Using
  57.         End Sub
Перегнал тоже самое в C# конвертером:
Код - C# [Выбрать]
  1. [CommandMethod("Test")]
  2. public void RunWblockCloneObjects()
  3. {
  4.         Document doc = Application.DocumentManager.MdiActiveDocument;
  5.         Database db = doc.Database;
  6.         Editor ed = doc.Editor;
  7.         List<string> _List = new List<string>();
  8.         _List.Add("Клеммники.281-657");
  9.         _List.Add("Клеммники.281-663");
  10.         _List.Add("Клеммники.282-681");
  11.         _List.Add("Клеммники.282-684");
  12.         _List.Add("Клеммники.284-687");
  13.         _List.Add("Клеммники.870-551");
  14.         _List.Add("Клеммники.870-557");
  15.         _List.Add("Клеммники.870-567");
  16.         _List.Add("Сх.281-657");
  17.         _List.Add("Сх.281-663");
  18.         _List.Add("Сх.282-681");
  19.         _List.Add("Сх.282-684");
  20.         _List.Add("Сх.284-681");
  21.         _List.Add("Сх.284-687");
  22.         _List.Add("Сх.870-551");
  23.         _List.Add("Сх.870-557");
  24.         _List.Add("Сх.870-567");
  25.         _List.Add("Сх.Одноярусный_кл_3проводный");
  26.         foreach (object _Name_loopVariable in _List) {
  27.                 _Name = _Name_loopVariable;
  28.  
  29.                 AddListBlockRecordToActiveDatabase("X:\\TestBlk.dwg", _Name);
  30.         }
  31. }
  32. //Вытягивает нужные блоки из внешнего файла если их нет в текущем
  33. private void AddListBlockRecordToActiveDatabase(string PathString, string BlkName)
  34. {
  35.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  36.         Document doc = Application.DocumentManager.MdiActiveDocument;
  37.         Database ActiveDb = doc.Database;
  38.         using (Database SourceDb = new Database(false, true)) {
  39.  
  40.                 SourceDb.ReadDwgFile(PathString, System.IO.FileShare.Read, true, "");
  41.                 ObjectIdCollection RequestedBlockIds = new ObjectIdCollection();
  42.                 HostApplicationServices.WorkingDatabase = SourceDb;
  43.                 using (Transaction acTrans = SourceDb.TransactionManager.StartTransaction()) {
  44.                         BlockTable bt = (BlockTable)acTrans.GetObject(SourceDb.BlockTableId, OpenMode.ForRead);
  45.                         if (bt.Has(BlkName)) {
  46.                                 BlockTableRecord btr = (BlockTableRecord)acTrans.GetObject(bt(BlkName), OpenMode.ForRead);
  47.                                 RequestedBlockIds.Add(btr.ObjectId);
  48.                         }
  49.                         acTrans.Commit();
  50.                 }
  51.                 HostApplicationServices.WorkingDatabase = ActiveDb;
  52.                 if (RequestedBlockIds.Count > 0) {
  53.                         IdMapping mapping = new IdMapping();
  54.                         using (DocumentLock doclock = doc.LockDocument()) {
  55.                                 ActiveDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false);
  56.                         }
  57.                 }
  58.  
  59.         }
  60. }


« Последнее редактирование: 10-02-2016, 22:28:22 от Volody1983 »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #40 : 10-02-2016, 21:57:34 »
При таком варианте ощутимо быстрее, т.к. один раз вызывается readdwgfile, а на его вызов тратится существенное время.
Это правда. Но это если блоки у тебя хранятся в одном файле и ты до закрытия формы занимаешься их вставкой.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #41 : 10-02-2016, 22:12:07 »
Александр Ривилис,
Если у Вас есть возможность проверьте плиз код в 39 посте на файле с блоками при которых рушится автокад (файл в том же посте приложен)?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #42 : 11-02-2016, 00:54:11 »
Если у Вас есть возможность проверьте плиз код в 39 посте на файле с блоками при которых рушится автокад (файл в том же посте приложен)?
Я проверил твой вариант (VB - Release) в чистом AutoCAD 2012 (2011 версии у меня нет) - всё сработало нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #43 : 11-02-2016, 01:12:48 »
Можешь попробовать еще такой вариант (без транзакции и без открытия блока в исходном файле, что совсем лишнее):
Код - vb.net [Выбрать]
  1. 'Вытягивает нужные блоки из внешнего файла если их нет в текущем
  2. Private Sub AddListBlockRecordToActiveDatabase(ByVal PathString As String, ByVal BlkName As String)
  3.     Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.     Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  5.     Dim ActiveDb As Database = doc.Database
  6.     Using SourceDb As New Database(False, False)
  7.         SourceDb.ReadDwgFile(PathString, System.IO.FileShare.Read, True, "")
  8.         SourceDb.CloseInput(True)
  9.         Dim RequestedBlockIds As New ObjectIdCollection()
  10.         Using bt As BlockTable =
  11.             DirectCast(SourceDb.BlockTableId.Open(OpenMode.ForRead), BlockTable)
  12.             If bt.Has(BlkName) Then
  13.                 RequestedBlockIds.Add(bt(BlkName))
  14.             Else
  15.                 Return
  16.             End If
  17.         End Using
  18.         If RequestedBlockIds.Count > 0 Then
  19.             Dim mapping As New IdMapping()
  20.             Using doclock As DocumentLock = doc.LockDocument()
  21.                 ActiveDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId,
  22.                                             mapping, DuplicateRecordCloning.Replace, False)
  23.             End Using
  24.         End If
  25.     End Using
  26. End Sub
  27.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Ошибка при использовании WblockCloneObjects
« Ответ #44 : 11-02-2016, 08:16:21 »
тестировать лучше по шагам. Александр дал уже готовый код, но тогда ошибку возможно не увидим. А хотелось бы.

1. Убери лишние строки в RunWblockCloneObjects:
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
Там нет работы с БД или документом

2. Попробуй убрать строки:
HostApplicationServices.WorkingDatabase = SourceDb;
HostApplicationServices.WorkingDatabase = ActiveDb;
Для цели вставки блоков, переключать не нужно.

3. Замени(Как у Александра)
BlockTableRecord btr = (BlockTableRecord)acTrans.GetObject(bt(BlkName), OpenMode.ForRead);
RequestedBlockIds.Add(btr.ObjectId);
на
RequestedBlockIds.Add(bt(BlkName))

4. Попробуй добавить Dispose(), после того, как закончил использовать:
ObjectIdCollection RequestedBlockIds
IdMapping mapping

5. Возможно крашит частое переключение блокировки листа DocumentLock doclock = doc.LockDocument()
Вынеси его в RunWblockCloneObjects()

6. Попробуй вставить в блок try-Catch:
ActiveDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false);
...у меня такое было, когда пытался клонировать прокси
И нужно вывести в строку имя блока, на каком блоке не выполнился WblockCloneObjects

Если все проделаешь по шагам, и найдешь ошибку, то будет просто замечательно)))

Оффлайн 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
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Ошибка при использовании WblockCloneObjects
« Ответ #48 : 11-02-2016, 09:07:51 »
Добавил mapping.Dispose
На это и подозревал.
Краткий ответ таков: "увы, но для всех объектов автокада нужно вызывать Dispose", кроме объектов, управляемых транзакцией.

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
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
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 534
  • Карма: 117
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
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #54 : 11-02-2016, 11:52:13 »
Отправлю инфу в личку, т.к. ее много, она не оформлена и явно не для этой темы.
Создавай тему - обсудим. В данном случае - это явная утечка памяти, т.к. mapping - это обертка для коллекция пар объектов, для которой Dispose вызывает освобождение памяти коллекции. От потока это не зависит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение