VB如何释放大内存
废话少说,看代码:
测试工程1:
------------------------
类ct代码
------------------------
Option Explicit
Private m_lngV2 As Long
Private m_lngV1 As Long
Private m_lngV3 As Long
Private m_lngV4 As Long
Private m_lngV5 As Long
Private m_lngV6 As Long
Private m_lngV7 As Long
Private m_lngV8 As Long
Private m_lngV9 As Long
Public Property Get V9() As Long
V9 = m_lngV9
End Property
Public Property Let V9(ByVal lngValue As Long)
m_lngV9 = lngValue
End Property
Public Property Get V8() As Long
V8 = m_lngV8
End Property
Public Property Let V8(ByVal lngValue As Long)
m_lngV8 = lngValue
End Property
Public Property Get V7() As Long
V7 = m_lngV7
End Property
Public Property Let V7(ByVal lngValue As Long)
m_lngV7 = lngValue
End Property
Public Property Get V6() As Long
V6 = m_lngV6
End Property
Public Property Let V6(ByVal lngValue As Long)
m_lngV6 = lngValue
End Property
Public Property Get V5() As Long
V5 = m_lngV5
End Property
Public Property Let V5(ByVal lngValue As Long)
m_lngV5 = lngValue
End Property
Public Property Get V4() As Long
V4 = m_lngV4
End Property
Public Property Let V4(ByVal lngValue As Long)
m_lngV4 = lngValue
End Property
Public Property Get V3() As Long
V3 = m_lngV3
End Property
Public Property Let V3(ByVal lngValue As Long)
m_lngV3 = lngValue
End Property
Public Property Get V1() As Long
V1 = m_lngV1
End Property
Public Property Let V1(ByVal lngValue As Long)
m_lngV1 = lngValue
End Property
Public Property Get V2() As Long
V2 = m_lngV2
End Property
Public Property Let V2(ByVal lngValue As Long)
m_lngV2 = lngValue
End Property
Public Sub SetValue(v() As Long)
m_lngV1 = v(0)
m_lngV2 = v(1)
m_lngV3 = v(2)
m_lngV4 = v(3)
m_lngV5 = v(4)
m_lngV6 = v(5)
m_lngV7 = v(6)
m_lngV8 = v(7)
m_lngV9 = v(8)
End Sub
-----------------------
类cts代码
-----------------------
Option Explicit
Private m_Colcts As Collection
Private Sub Class_Initialize()
Set m_Colcts = New Collection
End Sub
Sub Add(CtItem As ct, Optional varKey As Variant)
m_Colcts.Add CtItem, varKey
End Sub
Sub Remove(varIndex As Variant)
m_Colcts.Remove varIndex
End Sub
Function Item(varIndex As Variant) As ct
Set Item = Nothing
On Error Resume Next
Set Item = m_Colcts.Item(varIndex)
On Error GoTo 0
End Function
Function Exists(varIndex As Variant) As Boolean
Dim objTest As ct
Set objTest = Nothing
If Count > 0 Then
On Error Resume Next
Set objTest = Item(varIndex)
On Error GoTo 0
End If
Exists = Not (objTest Is Nothing)
End Function
Property Get Count() As Long
Count = m_Colcts.Count
End Property
Sub Clear()
Set m_Colcts = New Collection
End Sub
Function NewEnum() As IUnknown
Set NewEnum = m_Colcts.[_NewEnum]
End Function
-----------------------
Form1代码
-----------------------
Option Explicit
Private ts As cts
Private Sub Command1_Click()
Set ts = New cts
Dim i As Long
Dim t As ct
Dim a(0 To 8) As Long
For i = 0 To 8
a(i) = i
Next
Me.Timer1.Enabled = True
For i = 1 To 1000000
Set t = New ct
DoEvents
Me.Text1.Text = i
t.SetValue a
ts.Add t
Next
Me.Timer1.Enabled = False
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim p As ct
For Each p In ts
DoEvents
Set p = Nothing
Next
Set ts = Nothing
End Sub
------------------
注:
------------------
窗体Form1上放一个Command1,一个Text1
-------------------
问题
-------------------
关闭程序时无响应,占用的一大块内存没有被释放。
高手都来发表下意见吧……
[解决办法]
For i = 1 To 1000000 Set t = New ct
[解决办法]
不知直接.Clear下内存会是怎么?
[解决办法]
做个延时1000毫秒之类的试试吧,
[解决办法]
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Dim i As Long For i = ts.Count To 1 Step -1 ts.Remove i Next Set ts = NothingEnd Sub
[解决办法]
其实加一个按钮
Private Sub Command2_Click()
Set ts = Nothing
End Sub
盯着任务管理器,你会发现内存的确是被释放了,只不果释放速度比创建的时候慢
[解决办法]
这个。。。。
[解决办法]
又不是C,何必操心释放内存的事情
[解决办法]
VB结束后即刻释放内存,但操作系统不一定遵照执行,因为操作系统为优化下次运行该程序的速度会将释放的内存标记为缓冲区,所以数字上看不出。
[解决办法]
给你一段代码,效果立杆见影,用在以觉得内存比较大,需要释放一下的时候
'释放内存,常用于第一次启动完窗体后,效果显著Private Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As LongPrivate Declare Function GetCurrentProcess Lib "kernel32" () As LongPrivate Sub releasemem() SetProcessWorkingSetSize GetCurrentProcess, -1, -1End Sub
[解决办法]
退出时直接调用End语句让操作系统自动释放你这个进程占用的内存试试。
[解决办法]
你Form1的代码贴全了么?timer似乎不是这样的用法哦
[解决办法]
友情UP......................
啥东东这么耗内存?运行过程中还要考虑内存释放?
[解决办法]
LZ要创建1000000个ct?? 你的代码本身就存在问题,是逻辑问题!
你向内存一下子申请这么多内存地址块,写代码的那个人不是有病吗?和电脑开国际玩笑是吧,可惜它不能像你一样会笑啊!
------解决方案--------------------
我把楼主的程序调试状态下直接END了,现在VB里的鼠标还在沙漏状态,好几分钟了。
记得这个问题我似乎也遇到过,也是做测试,一下子建立大量对象,New的时候快,结束程序的时候要慢很多。
[解决办法]
汗,貌似把我同时开着的VBA IDE也弄死了
[解决办法]
Private Sub Form_Unload(Cancel As Integer) Dim i As Long Dim sngStart As Single Screen.MousePointer = vbHourglass sngStart = Timer For i = ts.Count To 1 Step -1 If i Mod 1000 = 0 Then Debug.Print Timer - sngStart DoEvents sngStart = Timer End If ts.Remove i Next Set ts = Nothing Debug.Print Timer - sngStart Screen.MousePointer = vbDefaultEnd Sub
[解决办法]
Private Sub Command1_Click() Me.Command1.Enabled = False Dim tCas As CAs Set tCas = New CAs Dim tCa As CA Dim iCa As Integer For iCa = 1 To 100 '我改到 100 了。 Set tCa = New CA tCa.IndexKey = "a" & iCa Dim tCb As CB Dim iCb As Long For iCb = 1 To 50 Set tCb = New CB tCb.IndexKey = "b" & iCb tCa.Childs.Add tCb Set tCb = Nothing Next tCas.Add tCa Set tCa = Nothing Next '做要做的事 Debug.Print tCas.Count, tCas.Item(1).Childs.Count '做完了释放 ' ****** 楼主注意比较有这段代码和没这段代码的区别 ****** Dim i&, k& For i = tCas.Count To 1 Step -1 For k = tCas.Item(i).Childs.Count To 1 Step -1 tCas.Item(i).Childs.Remove tCas.Item(i).Childs.Item(1).IndexKey Next Set tCas.Item(i).Childs.Category = Nothing tCas.Remove tCas.Item(i).IndexKey Next ' ******************************************************* Set tCas = Nothing Me.Command1.Enabled = True End Sub
[解决办法]
我不清楚楼主的类代码为何要那样写。
但觉得这种类代码,简单地 set Noting ,不能正确释放对象。
[解决办法]