Ограничения памяти для приложений AutoCAD

Автор Тема: Ограничения памяти для приложений AutoCAD  (Прочитано 19501 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Для версий AutoCAD 2006-2015, Win XP, Win7 64, 32bit
Имеются ли ограничения для выделения объема ОЗУ для .NET
сборок, которые подключаются к AutoCAD?
Или операционная система (ОС) даст памяти столько, сколько требуется для загружаемой *.dll?

Вопрос возник из-за того, что в некоторых случаях AutoCAD выдает сообщение:
"Недостаточно памяти для выполнения операции".

Что касается моего приложения, то раньше это было часто, потом я нашел причину и
стал подчищать "мусор в памяти" - высвобождать память, выделяемую под объекты.
Ошибка о недостатке памяти стала появляться  реже (в 3% случаев).
 

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Скорее всего не Dispos'иш чего-либо. ИХМО в автокадае реализация сего сделанна ну очень не однозначно (хотя допускаю что "накрыть" .Net'ом "динамически" связанные между собой нативные классы, да еще и сделанные в разное время, это сама по себе задача геморойная). Лично я для себя так и не вывел простого правила когда он нужен, а когда нет (реально приходилось в отладчике смотреть - хотя я на .Net его вобще не запускал).

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Или операционная система (ОС) даст памяти столько, сколько требуется для загружаемой *.dll?
Операционная система выделяет память не для DLL, а для процесса, т.е. в нашем случае для acad.exe. В ОС x86 под каждый процесс выделяется максимум 2Гбайт памяти (в действительности несколько меньше) и 4Гбайт суммарно на все процессы (в серверных ОС этого ограничения нет). Если твоё приложение запрашивает достаточно большой кусок непрерывной памяти (например, под большой массив), то такого куска может и не оказаться и появится сообщение об ошибке. В ОС x64 такого ограничения нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Скорее всего не Dispos'иш
Что касается Dispose для фонтов перьев и кистей я делаю. А остальном нужно посмотреть
может для каких-то своих  объектов  нужно Диспозить?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
А остальном нужно посмотреть
может для каких-то своих  объектов  нужно Диспозить?
Своих - это каких? Общий принцип такой - если что-то ты создавал сам, и оно больше не нужно, и у него есть метод Dispose - вызывай его.
Для того, чтобы произошло реальное освобождение памяти может понадобится вызвать
Код - C# [Выбрать]
  1. GC.Collect();
  2. GC.WaitForPendingFinalizers();
Это не рекомендуется, так как требует время на выполнение и приводит к снижению производительности, но в ряде случаев может быть необходимым.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Своих - это каких?
Понял для объектов классов, которые создаются своим приложение dispose не нужен.
Этот метод же для неуправляемых ресурсов. 

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Понял для объектов классов, которые создаются своим приложение dispose не нужен.
Чего вдруг??? Если ты создаешь примитив AutoCAD и добавляешь его в чертеж, то Dispose не нужен, а если не создаешь, то нужен.
Этот метод же для неуправляемых ресурсов. 
Dispose() ? Почему для неуправляемых? Как раз у неуправляемых такого метода нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Почему для неуправляемых?
Тогда почему в Help пишут для неуправляемых?
http://msdn.microsoft.com/ru-ru/library/system.idisposable.dispose(v=vs.110).aspx

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда почему в Help пишут для неуправляемых?
:) Один (но не единственный) из способов использования - это если управляемый объект является "оберткой" для неуправляемого объекта. Например, управляемый класс Autodesk.AutoCAD.DatabaseServices.Circle является оберткой для неуправляемого класса AcDbCircle. Метод Dispose() класса Autodesk.AutoCAD.DatabaseServices.Circle в зависимости от того, добавлен ли Circle в чертеж (т.е. у него ненулевой ObjectId) или не добавлен (его ObjectId равно 0) выполняет или метод AcDbCircle.close() или освобождение неуправляемой памяти, т.е. вызывается delete AcDbCircle;

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

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, вот еще пример использования Dispose(): http://adn-cis.org/forum/index.php?topic=819.msg3301#msg3301
Конструкция using (Class a = new Class(...)) { ...  } приводит к вызову a.Dispose() по выходе из блока using.

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Перенесу ка я тему в AutoCAD .NET API
Я изначально хотел ее разместить в раздел AutoCAD .NET
но потом подумал, что работа с памятью это общая тема для адаптации приложений.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну так как эта тема на 95% связана с AutoCAD .NET API - пусть будет здесь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78