| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA: утечка памяти при вставке блоков

VBA: утечка памяти при вставке блоков

Ответ
Поиск в этой теме
Непрочитано 26.03.2009, 09:13 #1
VBA: утечка памяти при вставке блоков
Mikha
 
Highway Design
 
Tver
Регистрация: 16.09.2007
Сообщений: 27

Код:
[Выделить все]
Private Sub testInsBlock()
Dim BlockRef As AcadBlockReference
Dim InsPt(0 To 2) As Double
Dim BName As String
Dim i As Long: Dim N As Long

'Число вставляемых блоков
N = 10000
'Имя вставляемого блока; предварительно блок нужно загрузить в чертеж
BName = "m_point_03"
For i = 1 To N
    Set BlockRef = ThisDrawing.ModelSpace.InsertBlock(InsPt, BName, 1, 1, 1, 0)
    DoEvents
Next i
Debug.Print "Complete"

End Sub
Данный код вставляет в чертеж множество блоков. Во время выполнения кода постоянно увеличивается загрузка оперативной памяти (смотрел по диспетчеру задач). По окончании работы процедуры память не освобождается. А освобождается она только после закрытия AutoCAD. Расход памяти напрямую зависит от количества вставляемых блоков и от самих блоков. Так, например, при вставке 10000 блоков (см. вложение) программа безвозвратно расходует порядка 100 МБ оперативной памяти.
В чем проблема и как ее можно избежать?

P.S. AutoCAD 2006; WinXP

Вложения
Тип файла: dwg
DWG 2004
m_point_03.dwg (38.7 Кб, 907 просмотров)

Просмотров: 5278
 
Непрочитано 26.03.2009, 13:11
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Избежать никак.
Александр Ривилис вне форума  
 
Непрочитано 26.03.2009, 15:57
#3
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Насколько я понимаю, что лисп что ВБА декларативные языки высокого уровня, и с память освобождать не получится, хотя в лиспе есть какие-то функции но я с ними пока не дружу.
Sleekka вне форума  
 
Непрочитано 27.03.2009, 11:42
#4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Дело скорее не в языках, а в менеджере памяти AutoCAD.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 31.03.2009, 09:52
#5
Mikha

Highway Design
 
Регистрация: 16.09.2007
Tver
Сообщений: 27


Цитата:
Избежать никак.
Звучит как приговор
Проблема заключается во внутренней реализации метода ThisDrawing.ModelSpace.InsertBlock
причем не важно с помощью чего он вызван (кроме VBA написал аналогичную процедуру на Delphi – результат тот же).
Следующие способы вставки блоков также вызывают утечку памяти:
1. Операция копирования
Set BlockRefCopy = BlockRef.Copy
2. Командная строка
ThisDrawing.SendCommand "-insert" + vbCr + …

В сообщении №1 был не совсем прав. Память освобождается не только после закрытия AutoCAD, но и после закрытия того рисунка, в который были вставлены блоки.
Это можно использовать следующим образом:

Код:
[Выделить все]
Private Sub testInsBlockС()
Dim BlockRef As AcadBlockReference 'Ссылка на блок
Dim InsPt(0 To 2) As Double 'Точка вставки блока
Dim BName As String 'Имя вставляемого блока;блок должет быть загружен в чертеж
Dim i As Long: Dim j As Long 'Счетчики
Dim TotalCount As Long 'Число вставляемых блоков
Dim CloseCount As Long 'Число блоков, после вставки которого происходит закрытие-открытие файла чертежа
Dim FileName As String 'Полное имя файла чертежа

BName = "m_point_03"
TotalCount = 10001
CloseCount = 1000
FileName = ThisDrawing.FullName

If FileName = "" Then
    MsgBox "Сначала нужно сохранить чертеж"
    Exit Sub
End If
For i = 1 To TotalCount
    Set BlockRef = ThisDrawing.ModelSpace.InsertBlock(InsPt, BName, 1, 1, 1, 0)
    j = j + 1
    If (j = CloseCount) Or (i = TotalCount) Then
        ThisDrawing.Close True
        Application.Documents.Open FileName
        j = 0
    End If
    DoEvents
Next i
MsgBox "Complete"
End Sub
Но у данного способа есть несколько существенных недостатков:
1. С увеличением количества вставленных блоков увеличивается время открытия файла
2. В ходе вставки блоков чертеж сохраняется, отменить изменения невозможно

Возможно, у кого-то есть другие идеи, с удовольствием их выслушаю.
Mikha вне форума  
 
Непрочитано 31.03.2009, 11:05
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Идея - держать блоки в одном файле - вставлять весь файл как блок, а потом вставлять нужные блоки из active документ.
Sleekka вне форума  
 
Непрочитано 02.04.2009, 12:06
#7
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


А лисповая функция (gc) здесь не поможет?
Makswell вне форума  
 
Непрочитано 02.04.2009, 12:46
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Makswell Посмотреть сообщение
А лисповая функция (gc) здесь не поможет?
Ну а как она в принципе могла бы помочь? Она чистит неосвобожденную память lisp-переменных и только.
Александр Ривилис вне форума  
 
Непрочитано 02.04.2009, 14:33
#9
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Интересно, а какой практический смысл в этом коде? Зачем в одну точку вставлять 10000 одинаковых блоков?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 02.04.2009, 15:21
#10
Mikha

Highway Design
 
Регистрация: 16.09.2007
Tver
Сообщений: 27


Цитата:
Сообщение от AlexV Посмотреть сообщение
Интересно, а какой практический смысл в этом коде? Зачем в одну точку вставлять 10000 одинаковых блоков?
Вставка в чертеж блоков (высотная отметка) на основании текстового файла. Для простоты примера все блоки вставляются в одну точку, в реальной программе у каждого блока свои координаты.
Mikha вне форума  
 
Непрочитано 02.04.2009, 16:08
#11
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Как вариант, вставлять по 1000 (к примеру) блоков в файл, сохранять под именем Name1.dwg, следующие 1000 в Name2.dwg ну и так далее. А когда все повставляются, повтыкать их все внешней ссылкой в итоговый файл
(Что-то типа
Цитата:
Set Bl_ref = ThisDrawing.ModelSpace.AttachExternalReference(Path & Name & i, RName, InsPoint, 1, 1, 1, 0, False)
, а затем
Цитата:
ThisDrawing.Blocks.Item(RName.name).Bind True
Bl_ref.Delete
ThisDrawing.Blocks.Item("RName").Delete
)
(в Path - путь к папке с сохраненными Name_.dwg)
Не уверен, конечно, что это процесс убыстрит, но чем черт не шутит..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 02.04.2009, 17:04
#12
Mikha

Highway Design
 
Регистрация: 16.09.2007
Tver
Сообщений: 27


>>Sleekka #6
>>AlexV #11
За идеи спасибо, если в голову больше ничего не придет, то реализую их в коде, может и получится что-нибудь толковое. Но все-таки хотелось бы найти более простое и надежное решение.

Еще один "безумный" вариант - запись вставляемых блоков в виде файла .dxf (файл текстовый, проблем с утечкой памяти не будет), а уже затем вставлять его в нужный .dwg файл
Mikha вне форума  
 
Непрочитано 02.04.2009, 17:58
#13
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Mikha Посмотреть сообщение
Еще один "безумный" вариант - запись вставляемых блоков в виде файла .dxf (файл текстовый, проблем с утечкой памяти не будет), а уже затем вставлять его в нужный .dwg файл
Совершенно не уверен, что из-за того что dxf-файл текстовый не будет проблем с утечкой. Скорее уверен в обратном.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 03.04.2009, 09:18
#14
Mikha

Highway Design
 
Регистрация: 16.09.2007
Tver
Сообщений: 27


>>Александр Ривилис #13
Я имел ввиду программное создание текстового файла в формате .dxf без использования AutoCAD. В этом случае проблем с памятью не будет.
Проблемы будут со вставкой этого файла в существующий файл .dwg
Mikha вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA: утечка памяти при вставке блоков

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41
Есть ли возможность при вставке блока разрывать линии Незнайка AutoCAD 13 03.04.2006 20:34