(vlax-release-object) - тонкости работы
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > (vlax-release-object) - тонкости работы

(vlax-release-object) - тонкости работы

Ответ
Поиск в этой теме
Непрочитано 01.02.2006, 14:12 #1
(vlax-release-object) - тонкости работы
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 40,450

Известно, что функцию надо применять при обращении к COM-объектам. Вопросов собственно два:
1. Насколько необходимо применять (vlax-release-object) при обращении к собственным COM-библиотекам? В "САПР на базе..." функция то используется, то нет. В том числе и на внутренние представления объектов када (то есть, то нет), и на dll (тоже самое)
2. Каковы условия освобождения объекта? (vlax-release-object) освобождает объект не сразу, каким образом можно гарантированно очистить память? Поскольку применить (vlax-object-released-p) невозможно - объект является локальной переменной. А множить копии стороннего класса совсем не хочется...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 4226
 
Непрочитано 01.02.2006, 22:19 Re: (vlax-release-object) - тонкости работы
#2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от kpblc
Известно, что функцию надо применять при обращении к COM-объектам. Вопросов собственно два:
1. Насколько необходимо применять (vlax-release-object) при обращении к собственным COM-библиотекам? В "САПР на базе..." функция то используется, то нет. В том числе и на внутренние представления объектов када (то есть, то нет), и на dll (тоже самое)
2. Каковы условия освобождения объекта? (vlax-release-object) освобождает объект не сразу, каким образом можно гарантированно очистить память? Поскольку применить (vlax-object-released-p) невозможно - объект является локальной переменной. А множить копии стороннего класса совсем не хочется...
Тонкости замутила Autodesk в невнятной документации.

Есть vlax-get-object, обращающаяся к существующему COM и возвращающая указатель.

Есть vlax-create-object, создающая объект, но, возможно, не делающая его видимым.

Есть vlax-get-or-create-object, создающая объект или возвращающая указатель на существующий.

Есть еще vlax-get-acad-object.

Для Lisp это все может сохраняться в переменной, а в ней будет указатель на объект.

Уничтожать или нет однозначно нельзя сказать. Если делать разовое обращение через vlax-create-object, то лучше сделать пару vlax-release-object

Если много раз постоянно обращения, лучше, наверное, через vlax-get-or-create-object. Мои COM-серверы написаны так, что их и не надо уничтожать. Уничтожать объект Автокада смысла нет - к нему постоянные обращения. У меня он вообще в глобальной сидит. Да и попытка уничтожить несуществующий объект может принести больше вреда, чем если он останется в виде "мусора". У Лисп вообще сборка мусора автоматом происходит. Можно и принудительно - (gc)

А "гарантированно чистить" надо ли? Разве это что-то даст практически?

В самом объекте может быть разная реализация. Там поддерживается счетчик обращений, ведется своя "бухгалтерия". В этом деле сомандует Ole32.dll, возможно по разному в разных ОС. Как сделано в AutoCAD - не документировано. Разве что разбираться с интерфейсами. Вообще это сложный вопрос, разбирается долго и непонятно в специальной литературе. Кроме стандартных механизмов Windows могут еще и применяться посторонние приблуды, принудительно изгоняющие dll из памяти. Они тоже повлияют.

Пока я не могу дать однозначно правильного ответа. Только домыслы.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 02.02.2006, 08:24
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Возможно, проблема не стоит выеденного яйца. Суть в следующем: есть своя dll-ка (писать приходится самостоятельно, так что прошу не бить за выбор не Delphi - его изучать элементарно нет времени). Скомпилировал, зарегистрировал, проверка работы в каде (отдельно приложение под тестировку не пишу - подумал, что лучше проверять работу напрямую в каде). Сначала идет (setq svr (vlax-get-or-create-object "dll_name.class_name")), потом выполняются некоторые методы, устанавливаются свойства и прочая (т.е. обращение идет только внутри этого лиспа, переменная дальше не гуляет). После этого (vlax-release-object svr) и, как посоветовал Евгений Елпанов, (setq svr nil). Естественно, что svr - локальная переменная.
Так вот, попытка перерегистрации библиотеки (если ее сделать хотя бы в течение ближайших 5-6 минут) в тот же каталог выводит ошибку - типа библиотека занята. Стоит подождать, и, как правило, перерегистрация срабатывает. Если закрыть файл, из-под которого запускался lisp, то обычно regsvr32 нормально срабатывает, но тоже только раза 3-4. Потом требуется перезапускать кад.
Именно на основании этого я сделал заключение, что очистка svr не производится "до конца". Следовательно, где-то в памяти остаются следы от (vlax-get-or-create). Следовательно, утечка памяти практически гарантированна.
Вот и хотелось избежать подобной ситуации.
Специальная литература - где конкретно можно посмотреть на эту тему? Я искал инфу недели 3, но очень мало что нашел - все, что есть, рассчитано на С/С++ программистов, которым я не являюсь.
---
Уточнение: dll в первую очередь должна работать на AutoCAD 2005 Rus / Eng + SP1, OC: Windows 2000 + SP4 (возможно, WinXP SP2). Посторонних "чистильщиков" нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.02.2006, 09:13
#4
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Попробуй тогда использовать в лиспе
Код:
[Выделить все]
 vlax-create-object
и каждый раз его
Код:
[Выделить все]
vlax-release-object
Если имеет место временное ограничение - думаю винда не спешит освобождать от объекта память - отсюда и глюк...
И еще, полученную функцию открытия - закрытия поставь в цикл и посмотри в диспечер задач - будет ли утечка памяти...
Елпанов Евгений вне форума  
 
Непрочитано 02.02.2006, 14:07
#5
Alxd

Разработчик САПР
 
Регистрация: 14.05.2004
Тюмень
Сообщений: 467
<phrase 1=


kpЬlc, в серьезную тему Вы полезли. С COM моделью не зная броду, не суйся в воду. Надо оттестить свое приложение, на предмет корректного освобождения, а потом ссылаться на функции создания и освобождения в LISP.

Лично я когда начал писать COM модель тоже столкнулся с регистрацией COM сервера и его освобождением в системе. Рылся в литературе и инете долго. Есть неплохая ссылка http://www.gekko-software.nl/Delphi/Art00.htm где описано создание COM объекта, а также там было приложение отображающее существующие в системе COM сервера.

Когда вызываете метод release, освобождение произойдет незамедлительно и про ожидание не может быть и речи. А то, что приходится перезапускать AutoCAD для освобождения говорит о том, что сервер не освобождается. Его освобождает другой процесс после kill.

Кроме этого, ОЧЕНЬ ВНИМАТЕЛЬНО следите за освобождением объектов в LISP, т.к. от переизбытка их в системе (мусора) AutoCAD теряет стабильность. Появляются unhandled exception и прочие приколы. Особенно, когда происходит вызов методов возвращающих объекты в цикле. Они растут как снежный ком. AutoCAD стабильная система, но и она не терпит надругательств над памятью

Мой вердикт.
Если уж создал объект (vlax-create-object), будь добр его освободи (vlax-release-object).
Если вернул объект (vlax-get-object), освободи его (vlax-release-object).
Если вернул объект из коллекции (vlax-invoke-method obj 'Item), освободи его (vlax-release-object).

Внимательно с порядком освобождения объектов, которые вернулись из других функций и могут быть использованы в будущем... мрак.

P.S. Не скажу, что я такой внимательный и все освобождаю в своих прогах. Грешен. Но стремлюсь все отследить.
Alxd вне форума  
 
Автор темы   Непрочитано 02.02.2006, 14:23
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


> Alxd : Отличная ссылка, огромное спасибо!
Понимаете, дело в том, что это первый мой опыт в этой части, задачи, решаемые в СОМ-объекте - фактически минимум: формирование диалоговых окон и возвращение свойств в кад. Все, больше ничего. Свойства потом обрабатываются и дальше объект как таковой не нужен, да и ссылка на него тоже. По крайней мере, пока дело так обстоит.
Но все равно спасибо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > (vlax-release-object) - тонкости работы