Форум: "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;
// Ôèíàëèçàöèÿ ñòðóêòóð äëÿ îïðåäåëåíèÿ çàãðóçêè CPU íà 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.034 c