乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 90|回复: 5

VBA:内存问题

[复制链接]

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2006-5-29 12:12:54 | 显示全部楼层 |阅读模式
简介:
您好,我正在编写一组宏来处理AutoCAD存档(平面),以向其中添加图形对象(线条和其他),以便对它们进行计算(取决于线条的几何特征,它们在图形中的位置等)。为了制作这个项目,我一直在使用VBA,我没有使用任何基于数据库的系统来维护数据,我只使用将扩展数据封装和恢复到图形实体的方法(SetXData和GetXData方法)和SelectionSet对象,以便稍后恢复已处理的实体及其附加数据。
问题:
我写的宏还在继续,但是每当我执行它们时,我都会在任务的管理员(Windows 2000)中看到acad.exe使用的内存如何增长,最后在多次执行后,系统会关闭AutoCAD,因为这个。我不知道是什么原因导致AutoCAD使用的内存增加,但原因不是使用扩展数据:如果在“处理”图形后我将其关闭,并在我返回同一图形后立即返回,AutoCAD使用的内存级别将与开始时相同。在VBA中的过程中,我删除了在离开之前在过程中创建的所有SelectedSet,并且我不使用“动态”全局变量。我也使用数组,但它们都是局部变量,在过程结束之前被销毁(Erase指令)。总之,我还没有解决记忆问题。
问题:
任何人都可以帮助我吗?任何答案都将受到欢迎,因为我没有任何想法!(任何答案,愚蠢的答案都没关系。我花了很多天时间解决这个问题,我没有时间,代码太大(超过30000行),无法尝试另一种方法来开发我的项目。此外,我不是专家,我只在二维空间中处理基本概念(一年来,但我对AutoCAD知之甚少,我只使用VBA)。提前致谢,对不起我的英语(我住在西班牙。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-5-29 13:29:13 | 显示全部楼层
大多数情况下,这与内存泄漏有关
您应该通过以下方式调整宏以尽可能防止这种情况:
声明变量。
关闭可以关闭的对象,如果适当且可用,则退出。(例如My_Excel)
首先关闭依赖对象
,然后通过相同的层次结构将它们设置为无。
示例
Dim Eng 作为 DAO。DBEngine
Dim Db as DAO.Database
Dim rc as DAO.记录集

Eng = New DAO。DBEngine
Set db = Eng.OpenDatabase ....
“...。
“...。
“...。
设置 rc = db。OpenRecordset.....
“...。
“...。
“...。
Rc.Close
Db.Close

Set Rc = Nothing '取决于 Db 所以设置为 nothing first
Set Db = Nothing '取决于 Eng 所以设置为 nothing 第一
个 Set Eng = Nothing
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2006-5-29 13:43:21 | 显示全部楼层
在autodesk上有一个有趣的讨论http://discussion.autodesk.com/thread.jspa?messageID=5135697
提到了一个函数http://www.freevbcode.com/code/FreeMemory.bas。
如果你对这个函数做一点debug.printing,你可以看到你的内存使用跳转到哪里。
我不太确定你所说的擦除指令是什么意思。我认为擦除有一个糟糕的包装,但我不确定。
“擦除不恢复固定大小数组的内存”
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2006-5-29 13:59:59 | 显示全部楼层
对于AutoCAD,无论如何都存在内存问题,只需打开图形并离开(不要最小化屏幕),然后一段时间后内存使用量增加。您可以在任务管理器中检查它。然后,当您最小化AutoCAD并再次最大化时,mwmory使用率将降低回更易于管理的水平。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2006-5-30 10:55:23 | 显示全部楼层
一个没有被提及的可能性是你的选择集。如果每次运行选择集时都创建一个新的选择集,那么内存中的选择集数量将与运行选择集的次数一样多。大型选择集可能会很快导致问题。不知道自己在做什么,很难猜测。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-5-31 05:52:40 | 显示全部楼层
非常感谢大家的回复。
Dnereb,我将尝试在过程结束之前将所有SelectedSet设置为零(我相信唯一可能导致内存泄漏的变量是SelectedSet变量。我没有这样做,我认为清除并删除此变量就足够了。我通常在
使用SelectionSet变量的过程的末尾写
  1.     ....
  2.     ....
  3.     On Error Resume Next
  4.     objAcSelSet1.Clear
  5.     objAcSelSet1.Delete
  6.     On Error GoTo 0
  7.    
  8. End Sub

。由于所有这些变量都被声明为局部变量,我认为VB在过程之后释放了这些变量的内存,但也许内存没有被释放。如果它有效,我将再次在这个论坛上写信。
Bryco非常感谢您对欧特克论坛讨论的参考。我读了它,它给了我一些解决问题的想法(例如尝试从SelectitchSets集合中删除选择集,使用内存功能进行调试等)。关于 Erase 语句的使用:在我的代码中,我使用了一些绘图实体数组,即一维的动态数组(例如:
Dim objAcEntArrVigas() As AutoCAD.AcadEntity
),它们用于首先指向选择集的元素,然后将元素排序到数组中,使数组中元素的顺序与图形中数组所指向的实体的某些顺序相同(我用它来计算稍后在图形中排序的图元之间的距离。).由于数组是动态数组,我使用 Erase 语句释放之前数组使用的内存,然后使用 ReDim 为数组分配新大小的内存:
[代码 1]
对于固定大小的数组,擦除仅清除数组,它不会像您所说的那样恢复内存,但我只对动态数组使用 Erase。
Keith和Bob感谢,关于例程中的选择集,我遇到了问题(是计算平面结构元素上的力和力矩的例程,如梁上的力矩和力等)在具有最大深度水平的程序中,我有4个选择集,我认为选择集并不多, 并且每个集合的元素数小于1000(也许有时其中一个集合可以达到这个元素数。我通常写:
  1. Private Sub PlanoActualizar(blnPlanta As Boolean, intPlanta As Integer, blnReCalculables As Boolean _
  2. , blnContinuar As Boolean, udtError As mdlUtilidades01.tError)
  3.    
  4.     ' DECLARACIONES:
  5.     Dim objAcSelSet1 As AutoCAD.AcadSelectionSet
  6.     ....
  7.     ....
  8.     ....
  9.    
  10.     ' INSTRUCCIONES:
  11.     blnContinuar = True
  12.     blnError = False
  13.     Call ErrorAnular(udtError)
  14.    
  15.     ' Línea de errores no controlados.
  16.     ' Line of not-controlled errors.
  17.     On Error GoTo linError0
  18.    
  19.     ' At the beginning of procedures I inicialize the SelectionSet variables.
  20.     ' If I need to use a SelectionSet inside For....Next, I clear It in each loop, I don't create it again.
  21.     str1 = "PlanoActualizarAcSelSet1"
  22.     Set objAcSelSet1 = ThisDrawing.SelectionSets.Add(str1)
  23.     objAcSelSet1.Clear
  24.    
  25.     If blnContinuar Then
  26.         ....
  27.         ....
  28.         ....
  29.     End If
  30.    
  31. ' Línea de errores no controlados.
  32. ' Line of not-controlled errors.
  33. linError0:
  34.    
  35.     If (Err  0) Then
  36.         Call ErrorRetornar(Err, udtError)
  37.         Resume linError0
  38.     End If
  39.    
  40.     On Error GoTo 0
  41.    
  42.     On Error Resume Next
  43.     ' Clears the set of his items.
  44.     objAcSelSet1.Clear
  45.     ' Delete the set.
  46.     objAcSelSet1.Delete
  47.     On Error GoTo 0
  48.    
  49. End Sub

在执行例程后,所有由例程创建的选择集都从绘图中删除,但内存没有被释放。在某些过程中,我通过引用传递选择集,但是当执行返回到声明的过程时,这些选择集将被销毁。
好吧,我会继续解决它...非常感谢(抱歉我的英语不好。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 19:08 , Processed in 0.624984 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表