Mã:
Sub ReleaseObjectMemory()
'Co the la bat ky bien Object nao
Dim wSheet as Worksheet
'Dat bien Object
Set wSheet = Sheet1
'Dat code cua ban o day
'Giai phong bo nho
Set wSheet = Nothing
End Sub
Sub ReleaseObjectMemory()
'Co the la bat ky bien Object nao
Dim wSheet as Worksheet
'Dat bien Object
Set wSheet = Sheet1
'Dat code cua ban o day
'Giai phong bo nho
Set wSheet = Nothing
End Sub
Vậy anh có thể giúp em cho 1 ví dụ được không ạh.Tiện thể phân tích giúp em làm việc đó lợi ích là gì? Mình có đọc 1 số code thấy khai báo declare ... từ file.ocx or dll gì đó, như vậy có hao tốn bộ nhớ không, cần phải làm gì với những khai báo dạng như thế để đỡ tốn bộ nhớ.
Xin cám ơn.
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long, _
ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Trong code này có cái nào là biến gì đâu mà cần giải phóng hả bạn?Xin vui lòng cho hỏi, nếu khai báo trong Form như dưới đây, thì khi thoát Form dùng lệnh gì để giải phóng bộ nhớ?
PHP:Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As Long, _ ByVal hWndInsertAfter As Long, ByVal x As Long, _ ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Cám ơn rất nhiều!
Trong code này có cái nào là biến gì đâu mà cần giải phóng hả bạn?
Hàm API thôi mà! Quan trọng là bạn dùng nó ra sao? (mới biết mà nói tiếp được)
Vấn đề quan trọng vẫn là cách viết code thế nào!Cứ mỗi lần load form lên, rồi chuyển qua form khác rồi quay lại form này với form khác, vài lần thấy bộ nhớ bị tăng đáng kể có lúc bị ngưng hoạt động mà không làm gì trên form cả, từ 33M tăng 42, 71... (theo dõi qua Processing Task Management), nếu không phải nó thì tại sao nhỉ? Nhưng khi không sử dụng Form trở về Sheet (trước khi load form cho ẩn sheet) thì lại trở về 33M.
Vấn đề quan trọng vẫn là cách viết code thế nào!
Nếu có thể được, bạn cho file lên đây nhé
Em tìm ra nguyên nhân tăng dung lượng rồi Thầy ơi, không phải do Code mà là do Form. Thuộc tính Form em để Picture là Bitmap, nhúng hình vào đó, khi em gỡ ra thì không thấy tăng lên, hoặc tăng rất ít. Không lẽ show form này, unload form kia lại chồng dung lượng lên ta? Cái hình ảnh hưởng gì vậy?
Có lẽ trong Userform của Thiện có sử dụng cái gì đó liên quan tới ảnh?
Private Sub CommandButton1_Click()
Unload Me
UserForm2.Show
End Sub
Private Sub CommandButton1_Click()
Unload Me
UserForm1.Show
End Sub
Private Sub UserForm_Activate()
Image1.Picture = LoadPicture("D:\Anh\New Folder\DSC03069.jpg")
End Sub
Anh Thiện thử dùng phương thức LoadPicture xem sao, khi đóng nó tự mất hình cho đỡ mệt cái giải phóng biến:
Việc khai báo các hàm trong thư viện (*.dll, *.ocx, *.exe) với từ khóa Declare và việc viết các hàm và thủ tục trong VBA molule chỉ ảnh hưởng ít tới bộ nhớ, chỉ khi hàm hay thủ tục được sử dụng thực sự, nó sẽ được WINDOWS quản lý và giải phóng chúng hoàn toàn khỏi bộ nhớ khi thoát khỏi khỏi Excel.
Ảnh hưởng tới bộ nhớ xảy ra thực sự khi các hàm đó làm việc và nếu người viết hàm đó mà không có cơ chế bảo toàn bộ nhớ thì bộ nhớ của máy sẽ bị chiếm dụng và đến mục lúc phải khởi động lại máy.
View attachment 303913
Bạn ơi cho mình hỏi: Đoạn code trên sao chỉ Set FDFS = Nothing mà ko cần Set Filt = Nothing.
Cái này nói đúng ra là phải hiểu thêm về cơ chế dọn dẹp bộ nhớ của COM (VB6/VBA đều được xây dựng dựa trên COM), quản lý vòng đời của đối tượng dựa trên đếm tham chiếu (reference counting), bắt buộc mỗi đối tượng phải triển khai interface IUnknown gồm có ba phương thức là AddRef, QueryInterface và Release. Set obj To Nothing tương ứng với gọi phương thức Release giảm tham chiếu xuống một đơn vị, trong khi Set obj ... tuỳ thuộc vào câu lệnh mà có thể gọi phương thức AddRef hoặc QueryInterface tăng tham chiếu thêm một đơn vị. Khi gọi phương thức Release mà tham chiếu trả về 0 thì đối tượng tự xoá nó khỏi bộ nhớ. Khi kết thúc hàm/thủ tục VBA, với đối tượng thì gọi phương thức Release, với kiểu chuỗi BSTR thì gọi hàm SysFreeString, với kiểu mảng (SAFEARRAY) thì gọi hàm SafeArrayDestroy, còn kiểu Variant (VARIANT) thì gọi VariantClear.Kết nối với hàm thư viện (điển hình API's) theo luật chuẩn, giống như C++, VBA sẽ cho địa chỉ các kêt nối này vào bảng nối dựng ra (virtual table). Vì vậy hiếm có khi các hàm này chiếm bộ nhớ.
Bộ nhớ của Object chỉ là một vùng bộ nhớ chứa dữ liệu và chỉ dẫn về dữ liệu này. Phần này có mọt dịa chỉ khi Object được dựng lên.
Khi Set một Object là người ta bảo VBA chép cái địa chỉ trên vào tên biến.
Lệnh Set OBJ = Nothing bảo giải phóng lập tức. Tháo cái địa chỉ trên ra khỏi tên biến.
Không dùng lệnh set = nothing thì có thể đợi lúc thoát Sub/Function, mọi tên biến sẽ bị hủy.
Thực sự giải phóng bộ nhứ thuộc về một bộ phận tên là Garbage Collection (dọn rác). Bộ phận này có nhiệm vụ đi vòng vòng bộ nhớ của chương trình. Dò cái bảng kết nối biến với địa chỉ Objects. Nếu biến đã set nothing rồi thì đưoang nhiên nó không còn dính líu đến object. Bộ phận dọn rác sẽ check các biến khác, cứ biến nào đã bị hủy (do thoát Sub/Func) thì nó sẽ tháo ra.
*** Khi chắc ăn là không còn gì trỏ vào địa chỉ object nữa thì bộ phận dọn rác sẽ thực sự giải phóng bộ nhớ, trả chúng về stack hay heap gì đó.
Cho đến khoảng trước phiên bản 2013 thì MS vẫn còn nhiều rắc rối. Một ví dụ điển hình là ADODB, nếu để lâu không giải phóng kết nối với chính file thì có khả năng bị kẹt. Vì vậy, nếu dùng xong mà không cần để đó làm tiếp thì nên giải phóng ngay, đừng ỷ trượng vào lúc thoát sub/func để hủy biến.
Nhất là các sub/func có đệ quy thì việc giải phóng bộ nhớ khá quan trong.