下面介紹一種方法可以決定系統記憶體的多少、使用狀態等資訊。更重要的是,應用程式可以利用這項技術來決定客戶機的可用記憶體的大小,利用這些資訊,應用程式可以動態地最佳化程式的效能。例如,如果有足夠的記憶體可以利用雙緩衝最佳化位元影像的操作。
利用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;
使用舉例
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.