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

Как узнать загрузку процессора? (NT/2000/XP)

01.01.2007
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/en/tipsindex.php


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

Автор: Nomadic

Взято с https://delphiworld.narod.ru


const

 
  SystemBasicInformation = 0; 
  SystemPerformanceInformation = 2; 
  SystemTimeOfDayInformation = 3; 
 
type
  SYSTEM_BASIC_INFORMATION = packed record
    AlwaysZero              : ULONG;
    uKeMaximumIncrement     : ULONG;
    uPageSize               : ULONG;
    uMmNumberOfPhysicalPages: ULONG;
    uMmLowestPhysicalPage   : ULONG;
    uMmHighestPhysicalPage  : ULONG;
    uAllocationGranularity  : ULONG;
    pLowestUserAddress      : POINTER;
    pMmHighestUserAddress   : POINTER;
    uKeActiveProcessors     : POINTER;
    bKeNumberProcessors     : BYTE;
    Filler                  : array [0..2] of BYTE;
  end;
 
  SYSTEM_PERFORMANCE_INFORMATION = packed record
    nIdleTime               : INT64;
    dwSpare                 : array [0..75]of DWORD;
  end;
 
  SYSTEM_TIME_INFORMATION = packed record
    nKeBootTime             : INT64;
    nKeSystemTime           : INT64;
    nExpTimeZoneBias        : INT64;
    uCurrentTimeZoneId      : ULONG;
    dwReserved              : DWORD;
  end;
 
  function NtQuerySystemInformation(
    SystemInformationClass: DWORD;   // тип требуемой информации
    SystemInformation : Pointer;     // указатель на буфер, в который вернется информация
    SystemInformationLength : DWORD; // размер буфера в байтах
    var ReturnLength: DWORD          // сколько байт было возвращено или требуется
    ): DWORD; stdcall; external 'ntdll.dll';
 
...
 
var
  nOldIdleTime    : Int64 = 0;
  nOldSystemTime  : INT64 = 0;
  nNewCPUTime     : ULONG = 0;
 
procedure TTMDemo.tmrRefreshTimer(Sender: TObject);
var
  spi : SYSTEM_PERFORMANCE_INFORMATION;
  sti : SYSTEM_TIME_INFORMATION;
  sbi : SYSTEM_BASIC_INFORMATION;
  Dummy: DWORD;
begin
  if NTQuerySystemInformation(SystemBasicInformation, @sbi,
    SizeOf(SYSTEM_BASIC_INFORMATION), Dummy) = NO_ERROR then
    if NTQuerySystemInformation(SystemTimeOfDayInformation, @sti,
      SizeOf(SYSTEM_TIME_INFORMATION), Dummy) = NO_ERROR then
      if NTQuerySystemInformation(SystemPerformanceInformation, @spi,
        SizeOf(SYSTEM_PERFORMANCE_INFORMATION), Dummy) = NO_ERROR then
      begin
        if (nOldIdleTime <> 0) then
        begin
          nNewCPUTime:= Trunc(100 - ((spi.nIdleTime - nOldIdleTime)
            / (sti.nKeSystemTime - nOldSystemTime) * 100)
            / sbi.bKeNumberProcessors + 0.5);
          if (nNewCPUTime <> nOldIdleTime) then
            Caption := IntToStr(nNewCPUTIME);
        end;
        nOldIdleTime   := spi.nIdleTime;
        nOldSystemTime := sti.nKeSystemTime;
      end;
end;

Автор: Александр (Rouse_) Багель

Взято из https://forum.sources.ru