Giải thích giúp mình code giải phóng bộ nhớ từ biến (5 người xem)

  • Thread starter Thread starter adult
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

adult

Thành viên hoạt động
Tham gia
2/12/07
Bài viết
193
Được thích
30
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
mình đọc được đoạn code trên của bác levanduyet nhưng kô hiểu lắm. Mong các bạn có thể cho mình 1 ví dụ cụ thể được không ạh, và giải thích khi có code thì khác gì so với kô có
 
-Đó chưa phải là một đoạn code hoàn chỉnh. Đúng hơn chỉ là phần đầu và phần cuối của Sub. Còn phần giữa là code của bạn bổ sung vào.
-Theo mình hiểu, đó chỉ là một ví dụ để hướng dẫn kỹ năng viết code. Vào đầu thủ tục, nếu ta gán giá trị cho một biến đối tượng thì phần cuối phải Set = Nothing để giải phóng bộ nhớ.
 
Upvote 0
Đúng như bác Voda hướng dẫn, biến đối tượng có thể làm đầy bộ nhớ --> tốc độ xử lý của máy tính sẽ chậm đi. Vì vậy, khi đặt biến bằng Nothing thì có thể hiểu biến đã bị xóa bỏ khi đã sử dụng xong. Chỉ có điều nếu dùng biến dạng Public thì cẩn thận Nothing khi biến đang sử dụng.
 
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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.

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.
 
Upvote 0
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!
 
Upvote 0
Xin vui lòng cho hỏi lại, nếu có ai đó trả lời. Kính nhờ Mod xóa dùm threat này!
 
Upvote 0
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)
 
Upvote 0
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)

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.
 
Upvote 0
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é
 
Upvote 0
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?
 
Upvote 0
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?
 
Upvote 0
Có lẽ trong Userform của Thiện có sử dụng cái gì đó liên quan tới ảnh?

Em đã thử nghiệm với 2 Form, mỗi Form insert 1 Picture (khoảng 2M). Trước khi load form thì Window Task Manager báo bộ nhớ Excel.exe chiếm khoảng 30M, nhưng khi load Form1 lên, rồi từ đó load Form2 thoát Form1, rồi từ Form2 gọi Form1, thoát Form2, lặp đi lặp lại khoảng 15 lần, bộ nhớ tăng lên 520M. Rõ ràng, nó không giải phóng được bộ nhớ khi có Picture!
Form chỉ có 1 CommandButton, Code trong form chỉ như vầy:
PHP:
Private Sub CommandButton1_Click()
  Unload Me
  UserForm2.Show
End Sub

PHP:
Private Sub CommandButton1_Click()
  Unload Me
  UserForm1.Show
End Sub
 

File đính kèm

Upvote 0
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:

Private Sub UserForm_Activate()
Image1.Picture = LoadPicture("D:\Anh\New Folder\DSC03069.jpg")
End Sub
 
Upvote 0
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:

Hình như là nếu chuyển Form qua, lại liên tục, nên dùng UserForm.Hide (ở chế độ ẩn Form) thay cho Unload UserForm thì dung lượng sẽ không bị tăng!
Cám ơn Anh HƯỚNG nhé!
 
Upvote 0
Khi khai báo các biến trong chương trình con hay thủ tục hàm, sau khi dùng xong chương trình con hay thủ tục hàm thì chương trình cũng tự động giải phóng bộ nhớ rồi mà.Tôi nói như thế có đúng không nhỉ?
 
Upvote 0
Chào mọi người, xin hãy chỉ dẫn cho tôi vấn đề sau:
Ví dụ ở mỗi module Khi tôi khai báo các biến X,Y,Z ở dạng Public .. sau mỗi lần chạy code các biến này vẫn lưu lại giá trị.
Có đoạn code nào sau mỗi lần chạy code để nó xóa toàn bộ gia trị trong các biến này không, mà không phải thoát file?
 
Upvote 0
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.
1726114922922.png
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.
 
Upvote 0
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.

Về nguyên lý chung của ngôn ngữ VB/VBA là các biến sẽ được giải phóng khi thoát khỏi phạm vi sử dụng của nó. Ví dụ hai biến FDFS, Filt không cần phải Set xx= Nothing nó vẫn tự động được giải phóng khi hoàn thành thủ tục ListFilter. Nhưng việc viết Set FDFS = Nothing cá nhân tôi coi đó như một chuẩn mực khi lập trình, có những lúc ta không đợi khi thoát mới giải phóng, mà buộc phải giải phóng để tái sử dụng biến ở một đoạn code nào đó. Điều này mang tính chủ động của người viết code.

Với biến Filt không set Nothing hay set cũng như nhau, nguyên lý biến này VBA Set nó lần lượt tới từng đối tượng trong danh sách ở đầu mỗi vòng lặp, trước khi Set biến này cho thành phần mới thì nó được VBA Set = Nothing.
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom