Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

Загруженность 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.031 c
1-1097843033
Саша
2004-10-15 16:23
2004.10.31
Разрыв слитной строки в DrawText


4-1096332243
qwant
2004-09-28 04:44
2004.10.31
Сделать дефрагментатор диска


4-1096305827
Kolan
2004-09-27 21:23
2004.10.31
Проблема с регионом


3-1096884772
_none_
2004-10-04 14:12
2004.10.31
stream read error


6-1093007790
Эдик
2004-08-20 17:16
2004.10.31
Отмена неудачной попытки соединения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский