原来自己也想过,不过没有试成功,原来是定义的变量太小了!现在看了一篇台湾牛人的文章,才恍然大悟,一语惊醒梦中人呀....
如何释放记忆体
http://www.hosp.ncku.edu.tw/~cww/html/q00117.html
'代码写到Form中,在Form中添加一个按钮,Name=Command1
Private Sub Command1_Click()
Me.Caption = "Begin"
Dim i As Long, s() As Byte
i = CLng(Text1.Text) * 1024 * 1024
ReDim s(i)
Erase s
Me.Caption = "End"
End Sub 还有一个问题,像Win优化大师中的那个内存整理可以显示整理的进度(很多别的内存整理软件也可以做到),可,如果用动态二进制数组,在整理时更改数组的维数,就会越来越慢,如果不用数组(就像上面的代码),操作系统在分配内存时又不能中断,这样又如何做进度呢?希望绿豆兄可以帮忙想一下,麻烦你好多次了,没办法,技不如人,还没学到家......现在怎么好像没看到过暴风雨了?
如何释放记忆体
http://www.hosp.ncku.edu.tw/~cww/html/q00117.html
'代码写到Form中,在Form中添加一个按钮,Name=Command1
Private Sub Command1_Click()
Me.Caption = "Begin"
Dim i As Long, s() As Byte
i = CLng(Text1.Text) * 1024 * 1024
ReDim s(i)
Erase s
Me.Caption = "End"
End Sub 还有一个问题,像Win优化大师中的那个内存整理可以显示整理的进度(很多别的内存整理软件也可以做到),可,如果用动态二进制数组,在整理时更改数组的维数,就会越来越慢,如果不用数组(就像上面的代码),操作系统在分配内存时又不能中断,这样又如何做进度呢?希望绿豆兄可以帮忙想一下,麻烦你好多次了,没办法,技不如人,还没学到家......现在怎么好像没看到过暴风雨了?
Me.Caption = "Begin"
Dim i As Long, s() As Byte
i = CLng(Text1.Text) * 1024 * 1024 \ 99
Dim n As Long
For n = 1 To 99
ReDim s(i * n)
Me.Caption = n & "% Completed"
Next
Erase s
Me.Caption = "End"
End Sub
加上preserve似乎快了一些,不知为何。
'----------------------------------------对,这个办法我想过,如果分成100份不停的重定义数组,会有重复的部分,加了Preserve好像也不行....
Me.Caption = "Begin"
Dim i As Long, _
s0() As Byte, _
s1() As Byte, _
s2() As Byte, _
s3() As Byte, _
s4() As Byte, _
s5() As Byte, _
s6() As Byte, _
s7() As Byte, _
s8() As Byte, _
s9() As Bytei = CLng(Text1.Text) * 1024 * 1024 \ 9Me.Caption = " 0% Completed": ReDim s0(i)
Me.Caption = "10% Completed": ReDim s1(i)
Me.Caption = "20% Completed": ReDim s2(i)
Me.Caption = "30% Completed": ReDim s3(i)
Me.Caption = "40% Completed": ReDim s4(i)
Me.Caption = "50% Completed": ReDim s5(i)
Me.Caption = "60% Completed": ReDim s6(i)
Me.Caption = "70% Completed": ReDim s7(i)
Me.Caption = "80% Completed": ReDim s8(i)
Me.Caption = "90% Completed": ReDim s9(i)Erase s0
Erase s1
Erase s2
Erase s3
Erase s4
Erase s5
Erase s6
Erase s7
Erase s8
Erase s9
Me.Caption = "End"End Sub
这种操作我认为交给VC会好一点!
Option Explicit
Dim C(99) As MemHole
Dim i As Long, n As LongPrivate Sub Command1_Click()
i = CLng(Text1.Text) * 10486 ' = 1024 * 1024 / 100
For n = 0 To 99
Me.Caption = "Processing " & n & "% ..."
Set C(n) = New MemHole
C(n).Alloc i
Next
Me.Caption = "Processing 100% ..."
Erase C
Me.Caption = "Complete"
End Sub'Class: MemHole
Option ExplicitDim S() As BytePublic Sub Alloc(Bytes As Long)
ReDim S(Bytes)
End Sub'Private Sub Class_Terminate()
' Erase S
'End Sub'销毁类时自动释放内存,不劳您老人家操心
'可以看出,Erase C 跟一个一个的Set C = Nothing是等同的
Private Type SS
S() As Byte
End Type
Dim C(99) As SS
Dim i As Long, n As LongPrivate Sub Command1_Click()
i = CLng(Text1.Text) * 10486 ' = 1024 * 1024 / 100
For n = 0 To 99
Me.Caption = "Processing " & n & "% ..."
ReDim C(n).S(i)
Next
Me.Caption = "Processing 100% ..."
Erase C
Me.Caption = "Complete"
End Sub
这个准确点不叫内存整理,而叫内存释放,关于内存整理有很大的技巧,关键是释放内存中无用的DLL和相关调用的文件\程序之类,但是内存释放就很简单了,我有一个中文的完全代码,速度极快,但是内存整理不可能这么快了.
--------------------------------------------------------------
cso(sjxsoft)有什么高见要拿出来分享一下啊。