DelphiFAQ Home Search:

Reading CPU and memory usage

 

comments2 comments. Current rating: 4 stars (1 votes). Leave comments and/ or rate it.

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;

Comments:

2005-11-23, 09:34:12
anonymous from Germany  
what uses are needet for your script?
I got an Error, my Delphi does not know 'Li2Double'
2007-08-27, 07:13:18
anonymous  
rating
please explain this program

 

 

Email address (not necessary):

Rate as
Hide my email when showing my comment.
Please notify me once a day about new comments on this topic.
Please provide a valid email address if you select this option.
 
It seems that you are
from Los Angeles, US .

Info/ Feedback on this

Show city and country
Show country only
Hide my location
You can mark text as 'quoted' by putting [quote] .. [/quote] around it.
Please type in the code:
photo Add a picture:

Please do not post inappropriate pictures. Inappropriate pictures include pictures of minors and nudity. The owner of this web site reserves the right to delete such material.