Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как получить информацию о загрузке процессора?

01.01.2007
Читать из реестра HKEY_DYN_DATA\PerfStats\StatData соответствующий ключ Kernel \CPUUsage.

Автор: Nomadic

https://delphiworld.narod.ru/

DelphiWorld 6.0


//NT – 2000 - XP
const
  SystemBasicInformation = 0;
  SystemPerformanceInformation = 2;
  SystemTimeInformation = 3;
 
type
  TPDWord = ^DWORD;
 
  TSystem_Basic_Information = packed record
    dwUnknown1: DWORD;
    uKeMaximumIncrement: ULONG;
    uPageSize: ULONG;
    uMmNumberOfPhysicalPages: ULONG;
    uMmLowestPhysicalPage: ULONG;
    uMmHighestPhysicalPage: ULONG;
    uAllocationGranularity: ULONG;
    pLowestUserAddress: Pointer;
    pMmHighestUserAddress: Pointer;
    uKeActiveProcessors: ULONG;
    bKeNumberProcessors: byte;
    bUnknown2: byte;
    wUnknown3: word;
  end;
 
type
  TSystem_Performance_Information = packed record
    liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}
    dwSpare: array[0..75] of DWORD;
  end;
 
type
  TSystem_Time_Information = packed record
    liKeBootTime: LARGE_INTEGER;
    liKeSystemTime: LARGE_INTEGER;
    liExpTimeZoneBias: LARGE_INTEGER;
    uCurrentTimeZoneId: ULONG;
    dwReserved: DWORD;
  end;
 
var
  NtQuerySystemInformation: function(infoClass: DWORD;
    buffer: Pointer;
    bufSize: DWORD;
    returnSize: TPDword): DWORD; stdcall = nil;
 
  liOldIdleTime: LARGE_INTEGER = ();
  liOldSystemTime: LARGE_INTEGER = ();
 
function Li2Double(x: LARGE_INTEGER): Double;
begin
  Result := x.HighPart * 4.294967296E9 + x.LowPart
end;
 
procedure GetCPUUsage;
var
  SysBaseInfo: TSystem_Basic_Information;
  SysPerfInfo: TSystem_Performance_Information;
  SysTimeInfo: TSystem_Time_Information;
  status: Longint; {long}
  dbSystemTime: Double;
  dbIdleTime: Double;
 
  bLoopAborted: boolean;
 
begin
  if @NtQuerySystemInformation = nil then
    NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
      'NtQuerySystemInformation');
 
  // get number of processors in the system
 
  status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo,
    SizeOf(SysBaseInfo), nil);
  if status <> 0 then
    Exit;
 
  // Show some information
  with SysBaseInfo do
  begin
    ShowMessage(
      Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13   +
      'uMmNumberOfPhysicalPages: %d' + #13 + 'uMmLowestPhysicalPage: %d' + #13 +
      'uMmHighestPhysicalPage: %d' + #13 + 'uAllocationGranularity: %d'#13 +
      'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d'  ,
      [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages,
      uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity,
        uKeActiveProcessors, bKeNumberProcessors]));
  end;
 
  bLoopAborted := False;
 
  while not bLoopAborted do
  begin
 
    // get new system time
    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo,
      SizeOf(SysTimeInfo), 0);
    if status <> 0 then
      Exit;
 
    // get new CPU's idle time
    status := NtQuerySystemInformation(SystemPerformanceInformation,
      @SysPerfInfo, SizeOf(SysPerfInfo), nil);
    if status <> 0 then
      Exit;
 
    // if it's a first call - skip it
    if (liOldIdleTime.QuadPart <> 0) then
    begin
 
      // CurrentValue = NewValue - OldValue
      dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) -
        Li2Double(liOldIdleTime);
      dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) -
        Li2Double(liOldSystemTime);
 
      // CurrentCpuIdle = IdleTime / SystemTime
      dbIdleTime := dbIdleTime / dbSystemTime;
 
      // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
      dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors
        + 0.5;
 
      // Show Percentage
      Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %', dbIdleTime);
 
      Application.ProcessMessages;
 
      // Abort if user pressed ESC or Application is terminated
      bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or
        Application.Terminated;
 
    end;
 
    // store new CPU's idle and system time
    liOldIdleTime := SysPerfInfo.liIdleTime;
    liOldSystemTime := SysTimeInfo.liKeSystemTime;
 
    // wait one second
    Sleep(1000);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetCPUUsage
end;

Взято с сайта: https://www.swissdelphicenter.ch


{ **** UBPFD *********** by delphibase.endimus.com ****
>> Показывает загруженость процессора
 
Показывает загруженость процессора
 
Зависимости: registry,Windows, SysUtils, Forms,Gauges,
             Classes, Controls, ExtCtrls, StdCtrls;
Автор:       DDA, Vologda
Copyright:   Где-то найдено
Дата:        11 февраля 2004 г.
***************************************************** }
 
unit Unit1;
 
interface
 
uses
  registry, Windows, SysUtils, Forms, Gauges, Classes, Controls, ExtCtrls,
    StdCtrls;
 
type
  TForm1 = class(TForm)
    Gauge1: TGauge;
    Timer1: TTimer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  def: string;
  reg: TRegistry;
  Buffer: array[0..1000] of integer;
begin
  //-------------------------------
  reg := TRegistry.Create;
  reg.RootKey := HKEY_DYN_DATA;
  def := '';
  if reg.OpenKey('PerfStats\StartStat', false) = TRUE then
  begin
    reg.ReadBinaryData('KERNEL\CPUusage', buffer, 1000);
  end;
  reg.CloseKey;
  Timer1.Enabled := true;
 
end;
//-------------------------------
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  def: string;
  reg: TRegistry;
  B: array[1..4] of integer;
begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_DYN_DATA;
  def := '';
  if reg.OpenKey('PerfStats\StatData', false) = TRUE then
  begin
    reg.ReadBinaryData('KERNEL\CPUusage', b, 4);
  end;
 
  reg.CloseKey;
  Gauge1.Progress := b[1];
  Application.ProcessMessages;
 
  //-------------------------------
end;
 
end.