現在タスクマネージャに似せたようなアプリを作っています。
メモリ情報の取得・ドライブ情報の取得は出来ましたが、
CPUの使用率だけ何の関数を使ったらいいのか分かりません。
過去ログやネットでも検索しましたが、これだと分かる情報がありませんでした。
何の関数を使えば使えばいいのでしょうか?
宜しくお願いします。
http://q.hatena.ne.jp/1111819318
こんなかんじ?
google先生発言ありがとうございます。
そこから色んな所を探して、下のコードでCPU使用率を出す事が出来ました。
解決しました!
ちなみに開発環境は、
WindowsXP-Pro-SP2+Delphi7-Proです。
//============================================================================//
// CPU使用率を算出 //
//============================================================================//
//---宣言とかいっぱい---
type
_SYSTEM_PERFORMANCE_INFORMATION = record
IdleTime: LARGE_INTEGER;
Reserved: array [0..75] of DWORD;
end;
PSystemPerformanceInformation = ^TSystemPerformanceInformation;
TSystemPerformanceInformation = _SYSTEM_PERFORMANCE_INFORMATION;
_SYSTEM_BASIC_INFORMATION = record
Reserved1: array [0..23] of Byte;
Reserved2: array [0..3] of Pointer;
NumberOfProcessors: UCHAR;
end;
PSystemBasicInformation = ^TSystemBasicInformation;
TSystemBasicInformation = _SYSTEM_BASIC_INFORMATION;
_SYSTEM_TIME_INFORMATION = record
KeBootTime: LARGE_INTEGER;
KeSystemTime: LARGE_INTEGER;
ExpTimeZoneBias: LARGE_INTEGER;
CurrentTimeZoneId: ULONG;
end;
PSystemTimeInformation = ^TSystemTimeInformation;
TSystemTimeInformation = _SYSTEM_TIME_INFORMATION;
function NtQuerySystemInformation(
SystemInformationClass: UINT;
SystemInformation: Pointer;
SystemInformationLength: ULONG;
ReturnLength: PULONG): Integer; stdcall; external 'ntdll.dll';
var
FOldIdleTime: LARGE_INTEGER;
FOldSystemTime: LARGE_INTEGER;
//===CPU使用率算出関数===
function GetCPURate: Byte;
var
PerfInfo: TSystemPerformanceInformation;
TimeInfo: TSystemTimeInformation;
BaseInfo: TSystemBasicInformation;
IdleTime: INT64;
SystemTime: INT64;
begin
Result := 0;
if NtQuerySystemInformation(3, @TimeInfo, SizeOf(TimeInfo), nil) <> NO_ERROR then
Exit;
if NtQuerySystemInformation(2, @PerfInfo, SizeOf(PerfInfo), nil) <> NO_ERROR then
Exit;
if NtQuerySystemInformation(0, @BaseInfo, SizeOf(BaseInfo), nil) <> NO_ERROR then
Exit;
if (FOldIdleTime.QuadPart <> 0) and (BaseInfo.NumberOfProcessors <> 0) then
begin
IdleTime := PerfInfo.IdleTime.QuadPart-FOldIdleTime.QuadPart;
SystemTime := TimeInfo.KeSystemTime.QuadPart-FOldSystemTime.QuadPart;
if SystemTime <> 0 then
Result := Trunc(100.0-(IdleTime/SystemTime)*100.0/BaseInfo.NumberOfProcessors);
end;
FOldIdleTime := PerfInfo.IdleTime;
FOldSystemTime := TimeInfo.KeSystemTime;
end;
//---↑ここまで↑---
ツイート | ![]() |