delphi 获取CPU 使用率

2018-10-31


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Gauges;

type
_SYSTEM_PERFORMANCE_INFORMATION = record
   IdleTime: LARGE_INTEGER;
   Reserved: array[0..75] of DWORD;
end;
PSystemPerformanceInformation = ^TSystemPerformanceInformation;
TSystemPerformanceInformation = _SYSTEM_PERFORMANCE_INFORMATION;

_SYSTEM_BASIC_INFORMATION = record
   Reserved1: array[0..23] of Byte;
   Reserved2: array[0..3] of Pointer;
   NumberOfProcessors: UCHAR;
end;
PSystemBasicInformation = ^TSystemBasicInformation;
TSystemBasicInformation = _SYSTEM_BASIC_INFORMATION;

_SYSTEM_TIME_INFORMATION = record
   KeBootTime: LARGE_INTEGER;
   KeSystemTime: LARGE_INTEGER;
   ExpTimeZoneBias: LARGE_INTEGER;
   CurrentTimeZoneId: ULONG;
end;
PSystemTimeInformation = ^TSystemTimeInformation;
TSystemTimeInformation = _SYSTEM_TIME_INFORMATION;

type
TForm1 = class(TForm)
   Gauge1: TGauge;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;
function NtQuerySystemInformation(
SystemInformationClass: UINT;
SystemInformation: Pointer;
SystemInformationLength: ULONG;
ReturnLength: PULONG): Integer; stdcall; external 'ntdll.dll';

var
FOldIdleTime: LARGE_INTEGER;
FOldSystemTime: LARGE_INTEGER;
Form1: TForm1;

implementation

{$R *.dfm}

function GetCPURate: Byte;
var
PerfInfo: TSystemPerformanceInformation;
TimeInfo: TSystemTimeInformation;
BaseInfo: TSystemBasicInformation;
IdleTime: INT64;
SystemTime: INT64;
begin
Result := 0;
if NtQuerySystemInformation(3, @TimeInfo, SizeOf(TimeInfo), nil) <> NO_ERROR then
   Exit;
if NtQuerySystemInformation(2, @PerfInfo, SizeOf(PerfInfo), nil) <> NO_ERROR then
   Exit;
if NtQuerySystemInformation(0, @BaseInfo, SizeOf(BaseInfo), nil) <> NO_ERROR then
   Exit;
if (FOldIdleTime.QuadPart <> 0) and (BaseInfo.NumberOfProcessors <> 0) then
begin
   IdleTime := PerfInfo.IdleTime.QuadPart - FOldIdleTime.QuadPart;
   SystemTime := TimeInfo.KeSystemTime.QuadPart - FOldSystemTime.QuadPart;
   if SystemTime <> 0 then
   Result := Trunc(100.0 - (IdleTime / SystemTime) * 100.0 / BaseInfo.NumberOfProcessors);
end;
FOldIdleTime := PerfInfo.IdleTime;
FOldSystemTime := TimeInfo.KeSystemTime;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
self.Caption := inttostr(GetCPURate);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
gauge1.Progress := GetCPURate;
end;

end.


阅读142