[Delphi]TMemoryStatus--获取内存信息
下面介绍一种方法可以决定系统内存的多少、使用状态等信息。更重要的是,应用程序可以利用这项技术来决定客户机的可用内存的大小,利用这些信息,应用程序可以动态地优化程序的性能。例如,如果有足够的内存可以利用双缓存优化位图的操作。
利用Windows API函数GlobalMemoryStatus可以完成上述功能。
GlobalMemoryStatus接收一个类型为TMemoryStatus的变参,通过这个参数就可以获得Windows当前的内存状态。TMemoryStatus的结构如下:
原型
1 typedef struct _MEMORYSTATUS {
2
3 DWORD dwLength; { sizeof(MEMORYSTATUS),该记录结构的大小}
4 DWORD dwMemoryLoad; {使用内存所占百分比}
5 DWORD dwTotalPhys; { 全部物理内存字节数}
6 DWORD dwAvailPhys; { 可用物理内存字节数}
7 DWORD dwTotalPageFile; { 全部页文件字节数 }
8 DWORD dwAvailPageFile; { 可用页文件字节数 }
9 DWORD dwTotalVirtual; { 全部虚拟内存字节数}
10 DWORD dwAvailVirtual; { 可用虚拟内存字节数}
11 } MEMORYSTATUS, *LPMEMORYSTATUS;
2
3 DWORD dwLength; { sizeof(MEMORYSTATUS),该记录结构的大小}
4 DWORD dwMemoryLoad; {使用内存所占百分比}
5 DWORD dwTotalPhys; { 全部物理内存字节数}
6 DWORD dwAvailPhys; { 可用物理内存字节数}
7 DWORD dwTotalPageFile; { 全部页文件字节数 }
8 DWORD dwAvailPageFile; { 可用页文件字节数 }
9 DWORD dwTotalVirtual; { 全部虚拟内存字节数}
10 DWORD dwAvailVirtual; { 可用虚拟内存字节数}
11 } MEMORYSTATUS, *LPMEMORYSTATUS;
使用举例
1 { 在windows7 + Delphi2010下编译通过 }
2 {但是显示的dwTotalPageFile和dwAvailPageFile都是负值,为什么么?}
3 unit Unit2;
4
5 interface
6
7 uses
8 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
9 Dialogs, StdCtrls;
10
11 type
12 TForm2 = class(TForm)
13 mmo1: TMemo;
14 btn1: TButton;
15 procedure btn1Click(Sender: TObject);
16 private
17 { Private declarations }
18 public
19 { Public declarations }
20 end;
21
22 var
23 Form2: TForm2;
24
25 implementation
26
27 {$R *.dfm}
28
29 procedure TForm2.btn1Click(Sender: TObject);
30 var
31 memoinfo : TMemoryStatus;
32 begin
33
34 GlobalMemoryStatus(memoinfo);
35 with mmo1.Lines do
36 begin
37 Add(Format('Length:' + #9#9 + '%d' + ' Bytes',[memoinfo.dwLength]));
38 Add(Format('MemoryLoad:' + #9 + '%d' ,[memoinfo.dwMemoryLoad]));
39 Add(Format('TotalPhys:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalPhys]));
40 Add(Format('AvailPhys:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailPhys]));
41 Add(Format('TotalPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalPageFile]));
42 Add(Format('AvailPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailPageFile]));
43 Add(Format('TotalVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalVirtual]));
44 Add(Format('AvailVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailVirtual]));
45 end;
46 end;
47 end.
2 {但是显示的dwTotalPageFile和dwAvailPageFile都是负值,为什么么?}
3 unit Unit2;
4
5 interface
6
7 uses
8 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
9 Dialogs, StdCtrls;
10
11 type
12 TForm2 = class(TForm)
13 mmo1: TMemo;
14 btn1: TButton;
15 procedure btn1Click(Sender: TObject);
16 private
17 { Private declarations }
18 public
19 { Public declarations }
20 end;
21
22 var
23 Form2: TForm2;
24
25 implementation
26
27 {$R *.dfm}
28
29 procedure TForm2.btn1Click(Sender: TObject);
30 var
31 memoinfo : TMemoryStatus;
32 begin
33
34 GlobalMemoryStatus(memoinfo);
35 with mmo1.Lines do
36 begin
37 Add(Format('Length:' + #9#9 + '%d' + ' Bytes',[memoinfo.dwLength]));
38 Add(Format('MemoryLoad:' + #9 + '%d' ,[memoinfo.dwMemoryLoad]));
39 Add(Format('TotalPhys:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalPhys]));
40 Add(Format('AvailPhys:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailPhys]));
41 Add(Format('TotalPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalPageFile]));
42 Add(Format('AvailPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailPageFile]));
43 Add(Format('TotalVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalVirtual]));
44 Add(Format('AvailVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailVirtual]));
45 end;
46 end;
47 end.
没事,别怕,这是签名→→┃ 青山幽谷笛声扬,白鹤振羽任翱翔。往事前尘随风逝,携手云峰隐仙乡。 ┃