Delphi取CPU利用率

    技术2025-01-21  9

    unit Agent;

    interface

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

    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)    Button1: TButton;    Timer1: TTimer;    Label1: TLabel;    procedure Timer1Timer(Sender: TObject);    procedure FormCreate(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  Form1: TForm1;  FOldIdleTime: LARGE_INTEGER;  FOldSystemTime: LARGE_INTEGER;

    implementation

    {$R *.dfm}

    function GetCPURate: Byte;varPerfInfo: TSystemPerformanceInformation;TimeInfo: TSystemTimeInformation;BaseInfo: TSystemBasicInformation;IdleTime: INT64;SystemTime: INT64;beginResult := 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) thenbegin    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.Timer1Timer(Sender: TObject);begin  self.Label1.Caption := IntToStr(GetCPURate);end;

    procedure TForm1.FormCreate(Sender: TObject);begin

    end;

    end.

    最新回复(0)