DelphiFAQ Home Search:
General :: Windows :: Programming :: Windows with Delphi :: Windows API
Windows programming with Delphi

Articles:

This list is sorted by recent document popularity (not total page views).
New documents will first appear at the bottom.

This is the FULL list of all articles in this category.

Featured Article

Reading CPU and memory usage

Question:

How can I read the CPU and memory usage on a computer?

Answer:

Use the function GetCPUUsage() from below.

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 = ();
   Usage: Double;
 
 
 procedure GetCPUUsage;
 var
   SysBaseInfo: TSystem_Basic_Information;
   SysPerfInfo: TSystem_Performance_Information;
   SysTimeInfo: TSystem_Time_Information;
   status: Longint; {long}
   dbSystemTime: Double;
   dbIdleTime: Double;
 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;
   // get new system time
  status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf
                                      (SysTimeInfo), nil);
   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
    Usage := dbIdleTime;
     if Usage>100 then
       Usage := 100
   end;
   // store new CPU's idle and system time
  liOldIdleTime := SysPerfInfo.liIdleTime;
   liOldSystemTime := SysTimeInfo.liKeSystemTime
 end;