Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 07-07-2014, 12:20:26

Название: Ограничения памяти для приложений AutoCAD
Отправлено: Алексей (IdeaSoft) от 07-07-2014, 12:20:26
Для версий AutoCAD 2006-2015, Win XP, Win7 64, 32bit
Имеются ли ограничения для выделения объема ОЗУ для .NET
сборок, которые подключаются к AutoCAD?
Или операционная система (ОС) даст памяти столько, сколько требуется для загружаемой *.dll?

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

Что касается моего приложения, то раньше это было часто, потом я нашел причину и
стал подчищать "мусор в памяти" - высвобождать память, выделяемую под объекты.
Ошибка о недостатке памяти стала появляться  реже (в 3% случаев).
 
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Дима_ от 07-07-2014, 13:09:01
Скорее всего не Dispos'иш чего-либо. ИХМО в автокадае реализация сего сделанна ну очень не однозначно (хотя допускаю что "накрыть" .Net'ом "динамически" связанные между собой нативные классы, да еще и сделанные в разное время, это сама по себе задача геморойная). Лично я для себя так и не вывел простого правила когда он нужен, а когда нет (реально приходилось в отладчике смотреть - хотя я на .Net его вобще не запускал).
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Александр Ривилис от 07-07-2014, 14:13:16
Или операционная система (ОС) даст памяти столько, сколько требуется для загружаемой *.dll?
Операционная система выделяет память не для DLL, а для процесса, т.е. в нашем случае для acad.exe. В ОС x86 под каждый процесс выделяется максимум 2Гбайт памяти (в действительности несколько меньше) и 4Гбайт суммарно на все процессы (в серверных ОС этого ограничения нет). Если твоё приложение запрашивает достаточно большой кусок непрерывной памяти (например, под большой массив), то такого куска может и не оказаться и появится сообщение об ошибке. В ОС x64 такого ограничения нет.
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Алексей (IdeaSoft) от 07-07-2014, 14:56:45
Скорее всего не Dispos'иш
Что касается Dispose для фонтов перьев и кистей я делаю. А остальном нужно посмотреть
может для каких-то своих  объектов  нужно Диспозить?
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Александр Ривилис от 07-07-2014, 15:09:17
А остальном нужно посмотреть
может для каких-то своих  объектов  нужно Диспозить?
Своих - это каких? Общий принцип такой - если что-то ты создавал сам, и оно больше не нужно, и у него есть метод Dispose - вызывай его.
Для того, чтобы произошло реальное освобождение памяти может понадобится вызвать
Код - C# [Выбрать]
  1. GC.Collect();
  2. GC.WaitForPendingFinalizers();
Это не рекомендуется, так как требует время на выполнение и приводит к снижению производительности, но в ряде случаев может быть необходимым.
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Алексей (IdeaSoft) от 07-07-2014, 15:45:39
Своих - это каких?
Понял для объектов классов, которые создаются своим приложение dispose не нужен.
Этот метод же для неуправляемых ресурсов. 
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Александр Ривилис от 07-07-2014, 15:53:09
Понял для объектов классов, которые создаются своим приложение dispose не нужен.
Чего вдруг??? Если ты создаешь примитив AutoCAD и добавляешь его в чертеж, то Dispose не нужен, а если не создаешь, то нужен.
Этот метод же для неуправляемых ресурсов. 
Dispose() ? Почему для неуправляемых? Как раз у неуправляемых такого метода нет.
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Алексей (IdeaSoft) от 07-07-2014, 16:01:47
Почему для неуправляемых?
Тогда почему в Help пишут для неуправляемых?
http://msdn.microsoft.com/ru-ru/library/system.idisposable.dispose(v=vs.110).aspx
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Александр Ривилис от 07-07-2014, 16:23:36
Тогда почему в Help пишут для неуправляемых?
:) Один (но не единственный) из способов использования - это если управляемый объект является "оберткой" для неуправляемого объекта. Например, управляемый класс Autodesk.AutoCAD.DatabaseServices.Circle является оберткой для неуправляемого класса AcDbCircle. Метод Dispose() класса Autodesk.AutoCAD.DatabaseServices.Circle в зависимости от того, добавлен ли Circle в чертеж (т.е. у него ненулевой ObjectId) или не добавлен (его ObjectId равно 0) выполняет или метод AcDbCircle.close() или освобождение неуправляемой памяти, т.е. вызывается delete AcDbCircle;

Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Александр Ривилис от 07-07-2014, 16:29:46
Кстати, вот еще пример использования 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.
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Алексей (IdeaSoft) от 07-07-2014, 17:13:40
Перенесу ка я тему в AutoCAD .NET API
Я изначально хотел ее разместить в раздел AutoCAD .NET
но потом подумал, что работа с памятью это общая тема для адаптации приложений.
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Александр Ривилис от 07-07-2014, 17:30:46
Ну так как эта тема на 95% связана с AutoCAD .NET API - пусть будет здесь.
Название: Re: Ограничения памяти для приложений AutoCAD
Отправлено: Андрей Бушман от 07-07-2014, 18:04:16
тынц (http://bushman-andrey.blogspot.ru/2014/03/autocad-net-api-idisposable.html).