Содержание материала

 

Code:

const

{©Drkb v.3(2007): www.drkb.ru}

 

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_) Багель

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить