|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
(vlax-release-object) - тонкости работы
Moderator
LISP, C# (ACAD 200[9,12,13,14])
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 40,450
|
||
Просмотров: 4227
|
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Есть 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 из памяти. Они тоже повлияют. Пока я не могу дать однозначно правильного ответа. Только домыслы. |
|||
![]() |
|
||||
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-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Попробуй тогда использовать в лиспе
Код:
Код:
И еще, полученную функцию открытия - закрытия поставь в цикл и посмотри в диспечер задач - будет ли утечка памяти... |
||||
![]() |
|
||||
Разработчик САПР Регистрация: 14.05.2004
Тюмень
Сообщений: 467
![]() |
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. Не скажу, что я такой внимательный и все освобождаю в своих прогах. Грешен. Но стремлюсь все отследить. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
> Alxd : Отличная ссылка, огромное спасибо!
Понимаете, дело в том, что это первый мой опыт в этой части, задачи, решаемые в СОМ-объекте - фактически минимум: формирование диалоговых окон и возвращение свойств в кад. Все, больше ничего. Свойства потом обрабатываются и дальше объект как таковой не нужен, да и ссылка на него тоже. По крайней мере, пока дело так обстоит. Но все равно спасибо.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |