程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi檢測內存狀態和使用率

Delphi檢測內存狀態和使用率

編輯:Delphi

Delphi枚舉系統進程,並檢測內存使用情況,以進度條百分比的形式顯示內存使用率,同時檢測實際內存總字節數、可用的實際內存字節數、分頁文件總字節數,虛擬內存的總字節數,可用的虛擬內存字節數等, 以下部分是對所要獲取數據項的變量定義:

dwLength: DWORD; //1.數據結構長度
dwMemoryLoad: DWORD; //2.內存使用百分比
dwTotalPhys: DWORD; //3.物理內存總字節數
dwAvailPhys: DWORD; //4.剩余的物理內存字節數
dwTotalPageFile: DWORD; //5.頁面文件總字節數
dwAvailPageFile: DWORD; //6.剩余的頁文件字節數
dwTotalVirtual: DWORD; //7.虛擬內存的總字節數
dwAvailVirtual: DWord; //8.剩余的虛擬內存字節數

以下是程序的完整代碼:

001 unit Unit1; 002 interface 003 uses 004   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 005   Dialogs, StdCtrls, ExtCtrls,mmsystem, Gauges,TLHelp32; 006 type 007   TForm1 = class(TForm) 008     Button1: TButton; 009     Memo1: TMemo; 010     Timer1: TTimer; 011     Gauge1: TGauge; 012     Gauge2: TGauge; 013     Gauge3: TGauge; 014     Label1: TLabel; 015     Label2: TLabel; 016     Label3: TLabel; 017     Label4: TLabel; 018     Button2: TButton; 019     ListBox1: TListBox; 020     procedure Button1Click(Sender: TObject); 021     procedure Timer1Timer(Sender: TObject); 022     procedure FormDestroy(Sender: TObject); 023     procedure Button2Click(Sender: TObject); 024   private 025     { Private declarations } 026   public 027     { Public declarations } 028   end; 029 var 030   Form1: TForm1; 031 implementation 032 {$R *.dfm} 033 procedure TForm1.Button1Click(Sender: TObject); 034 begin 035  Timer1.Enabled:=True; 036 end; 037 procedure TForm1.Timer1Timer(Sender: TObject); 038 var 039  str:String; 040  ml:TMemoryStatus; 041 begin 042 {const //完整的TMemoryStatus結構 043   GMEM_DISCARDED = $4000; 044   GMEM_LOCKCOUNT = 255; 045 type 046   PMemoryStatus = ^TMemoryStatus; 047   _MEMORYSTATUS = record 048     dwLength: DWord;          //1.數據結構長度 049     dwMemoryLoad: DWord;      //2.內存使用百分比 050     dwTotalPhys: DWord;       //3.物理內存總字節數 051     dwAvailPhys: DWord;       //4.剩余的物理內存字節數 052     dwTotalPageFile: DWord;   //5.頁面文件總字節數 053     dwAvailPageFile: DWord;   //6.剩余的頁文件字節數 054     dwTotalVirtual: DWord;    //7.虛擬內存的總字節數 055     dwAvailVirtual: DWord;    //8.剩余的虛擬內存字節數 056   end; 057   TMemoryStatus = _MEMORYSTATUS; 058   MEMORYSTATUS = _MEMORYSTATUS; 059 } 060  GlobalMemoryStatus(ml); 061  str:='數據結構長度:'+IntToStr(ml.dwLength)+#13#10 062      +'內存使用百分比:'+IntToStr(ml.dwMemoryLoad)+'%'+#13#10 063      +'實際內存總字節數 :'+FormatFloat('###,###',ml.dwTotalPhys)+#13#10 064      +'可用的實際內存字節數:'+FormatFloat('###,###',ml.dwAvailPhys)+#13#10 065      +'分頁文件總字節數 :'+FormatFloat('###,###',ml.dwTotalPageFile)+#13#10 066      +'分頁文件可用字節數 :'+FormatFloat('###,###',ml.dwAvailPageFile)+#13#10 067      +'虛擬內存的總字節數 :'+FormatFloat('###,###',ml.dwTotalVirtual)+#13#10 068      +'可用的虛擬內存字節數:'+FormatFloat('###,###',ml.dwAvailVirtual)+#13#10; 069  Memo1.Lines.Clear; 070  Memo1.Lines.Add(str); 071  //進度條顯示方式 072  Gauge1.Progress:=Round((1-ml.dwAvailPhys/ml.dwTotalPhys)*100); // 073  Gauge2.Progress:=Round((1-ml.dwAvailPageFile/ml.dwTotalPageFile)*100); 074  Gauge3.Progress:=Round((1-ml.dwAvailVirtual/ml.dwTotalVirtual)*100); 075  end; 076   077 procedure TForm1.FormDestroy(Sender: TObject); 078 begin 079  Timer1.Enabled:=False//程序退出時關閉Timer1 080 end; 081   082 procedure TForm1.Button2Click(Sender: TObject); 083 var lppe: TProcessEntry32; 084 {  tagPROCESSENTRY32 = packed record 085     dwSize: DWord;              //指定該結構的大小 086     cntUsage: DWord;            //進程的參照數 087     th32ProcessID: DWord;       //當前進程標志符 088     th32DefaultHeapID: DWord;   //當前進程的默認堆棧標志符 089     th32ModuleID: DWord;        //當前進程的模塊標志符 090     cntThreads: DWord;          //進程激活的執行線程數 091     th32ParentProcessID: DWord; //創建進程的父進程標志符 092     pcPriClassBase: Longint;    //基礎優先類 093     dwFlags: DWord;             //保留類,未使用 094     szExeFile: array[0..MAX_PATH - 1] of Char;// 進程相關的文件名 095   end; 096 } 097 found : boolean; 098 Hand : THandle; 099 begin 100  ListBox1.Clear; 101  ListBox1.Items.Add('進程名________進程ID'); 102  Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);  //創建一個進程快照 103  found := Process32First(Hand,lppe);   //獲取第一個進程 104 while found do 105  begin 106   ListBox1.Items.Add(lppe.szExeFile+'__________'+IntToStr(lppe.th32ProcessID));//列出所有進程。 107   found := Process32Next(Hand,lppe);   //不斷的獲取下一個進程 108  end; 109   Caption:='進程總數:'+IntToStr(listBox1.Items.Count-1); //得到進程總數 110 end; 111 end.

 程序運行最終效果運行截圖:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved