Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Загруженность CPU   Найти похожие ветки 

 
DelphiLexx ©   (2004-09-27 13:43) [0]

В реестре есть раздел HKEY_DYN_DATA. Основная информация о системе хранится
в ключе PerfStats.
Например для получения информации о загруженности процессора необходимо:
Просто считать значение ключа "PerfStats\StartStat\KERNEL\CPUusage" в секции
HKEY_DYN_DATA. данное действие запускает счётчик. После этого в ключе
"PerfStats\StatData\KERNEL\CPUusage" будет храниться значение в процентах о
загруженности процессора.
Этот способ отлично работает в Win9x, но неработает WinNT\2k\Xp. Как добится
того, чтобы это заработало и WinNT\2k\XP.
Заранее спасибо!


 
Users   (2004-09-27 15:38) [1]

Код модуля :


Type
 // Ñòðóêòóðû äëÿ îïðåäåëåíèÿ çàãðóçêè CPU íà êëîíàõ NT
 NTSTATUS = ULONG;
 PVOID = Pointer;
 _SYSTEM_INFORMATION_CLASS = (
   SystemBasicInformation,
   SystemProcessorInformation,
   SystemPerformanceInformation,
   SystemTimeOfDayInformation,
   SystemNotImplemented1,
   SystemProcessesAndThreadsInformation,
   SystemCallCounts,
   SystemConfigurationInformation,
   SystemProcessorTimes,
   SystemGlobalFlag,
   SystemNotImplemented2,
   SystemModuleInformation,
   SystemLockInformation,
   SystemNotImplemented3,
   SystemNotImplemented4,
   SystemNotImplemented5,
   SystemHandleInformation,
   SystemObjectInformation,
   SystemPagefileInformation,
   SystemInstructionEmulationCounts,
   SystemInvalidInfoClass1,
   SystemCacheInformation,
   SystemPoolTagInformation,
   SystemProcessorStatistics,
   SystemDpcInformation,
   SystemNotImplemented6,
   SystemLoadImage,
   SystemUnloadImage,
   SystemTimeAdjustment,
   SystemNotImplemented7,
   SystemNotImplemented8,
   SystemNotImplemented9,
   SystemCrashDumpInformation,
   SystemExceptionInformation,
   SystemCrashDumpStateInformation,
   SystemKernelDebuggerInformation,
   SystemContextSwitchInformation,
   SystemRegistryQuotaInformation,
   SystemLoadAndCallImage,
   SystemPrioritySeparation,
   SystemNotImplemented10,
   SystemNotImplemented11,
   SystemInvalidInfoClass2,
   SystemInvalidInfoClass3,
   SystemTimeZoneInformation,
   SystemLookasideInformation,
   SystemSetTimeSlipEvent,
   SystemCreateSession,
   SystemDeleteSession,
   SystemInvalidInfoClass4,
   SystemRangeStartInformation,
   SystemVerifierInformation,
   SystemAddVerifier,
   SystemSessionProcessesInformation);
 SYSTEM_INFORMATION_CLASS = _SYSTEM_INFORMATION_CLASS;

 _SYSTEM_PROCESSOR_TIMES = Packed Record
   IdleTime,
     KernelTime,
     UserTime,
     DpcTime,
     InterruptTime: int64;
   InterruptCount: ULONG;
 End;

 SYSTEM_PROCESSOR_TIMES = _SYSTEM_PROCESSOR_TIMES;
 PSYSTEM_PROCESSOR_TIMES = ^_SYSTEM_PROCESSOR_TIMES;

 TNativeQuerySystemInformation = Function(
   SystemInformationClass: SYSTEM_INFORMATION_CLASS;
   SystemInformation: PVOID;
   SystemInformationLength: ULONG;
   ReturnLength: PULONG
   ): NTSTATUS; StdCall;
Var
 // Ïåðåìåííûå äëÿ îïðåäåëåíèÿ çàãðóçêè CPU â Windows NT
 NTDllHandle       : THandle = 0; // Handle íà NTDLL.DLL
 QuerySystemInformation: TNativeQuerySystemInformation = Nil;
 CPUNTUsage        : PSYSTEM_PROCESSOR_TIMES;
 CPUNTUsageSize    : DWORD = 0;
 F_NT_LastValue    : Comp = 0;
 F_NT_Value        : Comp = 0;
 F_NT_LastTicks    : Cardinal = 0;

Implementation

Function GetNTCPUUsage: comp;
Begin
 QuerySystemInformation(SystemProcessorTimes, CPUNTUsage, CPUNTUsageSize, Nil);
 Result := CPUNTUsage^.IdleTime;
End;

// Èíèöèàëèçàöèÿ ñòðóêòóð äëÿ îïðåäåëåíèÿ çàãðóçêè CPU íà Windows NT/2000/XP

Function InitCPUInfo: Boolean;
Const
 STATUS_INFO_LENGTH_MISMATCH = $C0000004;
Var
 R                 : NTSTATUS;
 n                 : Integer;
Begin
 Result := False;
 NTDllHandle := GetModuleHandle("NTDLL.DLL");
 If NTDllHandle <> 0 Then
 Begin
   QuerySystemInformation := TNativeQuerySystemInformation(GetProcAddress(NTDllHandle, "ZwQuerySystemInformation"));
   n := 0;
   GetMem(CPUNTUsage, SizeOf(SYSTEM_PROCESSOR_TIMES));
   R := QuerySystemInformation(SystemProcessorTimes, CPUNTUsage, SizeOf(SYSTEM_PROCESSOR_TIMES), Nil);
   While R = STATUS_INFO_LENGTH_MISMATCH Do
   Begin
     Inc(N);
     ReallocMem(CPUNTUsage, N * SizeOf(CPUNTUsage^));
     R := QuerySystemInformation(SystemProcessorTimes, CPUNTUsage, n * SizeOf(SYSTEM_PROCESSOR_TIMES), Nil);
   End;
   CPUNTUsageSize := N * SizeOf(CPUNTUsage^);
   F_NT_LastTicks := GetTickCount;
   F_NT_LastValue := GetNTCPUUsage;
   Result := True;
 End;
End;

// &#212;&#232;&#237;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240; &#228;&#235;&#255; &#238;&#239;&#240;&#229;&#228;&#229;&#235;&#229;&#237;&#232;&#255; &#231;&#224;&#227;&#240;&#243;&#231;&#234;&#232; CPU &#237;&#224; Windows NT/2000/XP

Function FinalizeCPUInfo: Boolean;
Begin
 Freemem(CPUNTUsage);
 Result := True;
End;

Function GetCPUUse: Byte;
Const
 Timer100N         = 10000000;
 Timer1S           = 1000;
Var
 Interval          : Cardinal;
 Ticks             : Cardinal;
Begin
 Result := 100;
 Ticks := GetTickCount;
 F_NT_LastValue := F_NT_Value;
 F_NT_Value := GetNTCPUUsage;
 If (Ticks <= F_NT_LastTicks) Then
 Begin
   Result := 0;
 End
 Else
 Begin
   Interval := Ticks - F_NT_LastTicks;
   Result := Round((Timer100n - (F_NT_Value - F_NT_LastValue) / (Interval / Timer1s)) / Timer100n * 100);
 End;
 F_NT_LastTicks := Ticks;
End;


Вызов :

 InitCPUInfo;

 Procent:=GetCPUUse; // 0..100

 FinalizeCPUInfo;


 
grom   (2004-09-27 19:12) [2]

http://micsoft.narod.ru/bonus.html
CPU Usage выводит загрузку процессора в %. (~14KB)



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.035 c
4-1096390666
hgd
2004-09-28 20:57
2004.10.31
Скажите как нажать кнопку в другой открытой программе


1-1098099769
ORMADA
2004-10-18 15:42
2004.10.31
Ярлыки


3-1096459367
Bless
2004-09-29 16:02
2004.10.31
Почему парсер в queryAnalizer-е выдает ошибку


3-1096538798
It06
2004-09-30 14:06
2004.10.31
Фильтрация БД


4-1096223457
iZEN
2004-09-26 22:30
2004.10.31
О времени реакции ядра системы Windows.