ResourceFree
Hàm này xóa tài nguyên được tạo động (giải phóng bộ nhớ đã cấp phát cho nó).
bool ResourceFree(
const string resource_name // tên tài nguyên
);
2
3
Tham số
resource_name
[truyền vào] Tên tài nguyên phải bắt đầu bằng "::".
Giá trị trả về
Trả về true
nếu thành công, ngược lại trả về false
. Để lấy thông tin về lỗi, gọi hàm GetLastError()
.
Ghi chú
Hàm ResourceFree()
cho phép các nhà phát triển ứng dụng MQL5 quản lý việc tiêu thụ bộ nhớ khi làm việc tích cực với tài nguyên. Các đối tượng đồ họa liên kết với tài nguyên bị xóa khỏi bộ nhớ sẽ vẫn được hiển thị chính xác sau khi bị xóa. Tuy nhiên, các đối tượng đồ họa mới được tạo (OBJ_BITMAP
và OBJ_BITMAP_LABEL
) sẽ không thể sử dụng tài nguyên đã bị xóa.
Hàm này chỉ xóa các tài nguyên động được tạo bởi chương trình.
Ví dụ:
//+------------------------------------------------------------------+
//| Hàm khởi động chương trình script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo các tham số của tài nguyên đồ họa
string rc_name="Resource";
uint rc_width=100;
uint rc_height=100;
uint rc_data[];
uint rc_size=rc_width*rc_height;
ResetLastError();
//--- đặt kích thước của mảng pixel
if(ArrayResize(rc_data,rc_size)!=rc_size)
{
Print("ArrayResize() failed. Error code: ",GetLastError());
return;
}
//--- điền mảng pixel với màu trong suốt và tạo tài nguyên đồ họa dựa trên nó
ArrayInitialize(rc_data,0x00FFFFFF);
if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
{
Print("ResourceCreate() failed. Error code: ",GetLastError());
return;
}
Print("Size of created recource array: ",rc_data.Size());
//--- kiểm tra tài nguyên đồ họa đã tạo
//--- lấy dữ liệu thời gian và giá của thanh hiện tại
MqlTick tick={};
if(!SymbolInfoTick(Symbol(),tick))
{
Print("SymbolInfoTick() failed. Error code: ",GetLastError());
return;
}
//--- tạo đối tượng Bitmap sử dụng tọa độ của giá và thời gian tick cuối cùng
string obj_name="Bitmap";
if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
{
Print("ObjectCreate() failed. Error code: ",GetLastError());
return;
}
//--- đặt chiều rộng và chiều cao của đối tượng bitmap đã tạo bằng chiều rộng và chiều cao của tài nguyên đồ họa
//--- đặt điểm neo của đối tượng vào trung tâm của nó
ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);
ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);
ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- chỉ định tài nguyên đồ họa đã tạo trước đó cho đối tượng bitmap dưới dạng tệp hình ảnh
//--- trong trường hợp này, để chỉ ra tên của tài nguyên đồ họa được sử dụng, cần thêm "::" trước tên của nó
ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);
//--- đặt màu DodgerBlue với độ trong suốt 200
uint clr=ColorToARGB(clrDodgerBlue,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa với màu đã đặt
ArrayInitialize(rc_data,clr);
//--- cập nhật dữ liệu tài nguyên đồ họa
Update(rc_name,rc_data,rc_width,rc_height,true);
//--- chờ ba giây và thay đổi màu hình ảnh
Print("Wait 3 seconds before changing color");
Sleep(3000);
//--- đặt màu OrangeRed với độ trong suốt 200
Print("Change color");
clr=ColorToARGB(clrOrangeRed,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa với màu đã đặt
ArrayInitialize(rc_data,clr);
//--- cập nhật dữ liệu tài nguyên đồ họa
Update(rc_name,rc_data,rc_width,rc_height,true);
//--- chờ ba giây và giải phóng tài nguyên đồ họa
Print("Wait 3 seconds before ResourceFree()");
Sleep(3000);
bool res=ResourceFree("::"+rc_name);
Print("ResourceFree: ",res);
//--- thử thay đổi màu sau khi giải phóng tài nguyên
Print("Trying to change color to GreenYellow after ResourceFree()");
//--- đặt màu GreenYellow với độ trong suốt 200
clr=ColorToARGB(clrGreenYellow,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa với màu đã đặt
ArrayInitialize(rc_data,clr);
//--- cập nhật dữ liệu tài nguyên đồ họa (hình ảnh vẫn còn, nhưng màu không thể thay đổi)
Update(rc_name,rc_data,rc_width,rc_height,true);
Print("The color has not changed because the resource has been released");
//--- chờ ba giây và xóa đối tượng bitmap
Print("Wait 3 seconds before deleting the Bitmap object");
Sleep(3000);
Print("Delete Bitmap object");
ObjectDelete(0,obj_name);
}
//+------------------------------------------------------------------+
//| Cập nhật dữ liệu tài nguyên đồ họa |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
{
//--- rời khỏi nếu kích thước bằng 0 được truyền vào
if(width==0 || height==0)
return;
//--- cập nhật dữ liệu tài nguyên và vẽ lại biểu đồ
if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
ChartRedraw();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Xem thêm
Resources
, ObjectCreate()
, PlaySound()
, ObjectSetString()
, OBJPROP_BMPFILE