タスクマネージャのCPU使用率を取得するには?

解決


MINI  2008-08-06 20:23:06  No: 31489

現在タスクマネージャに似せたようなアプリを作っています。
メモリ情報の取得・ドライブ情報の取得は出来ましたが、
CPUの使用率だけ何の関数を使ったらいいのか分かりません。

過去ログやネットでも検索しましたが、これだと分かる情報がありませんでした。
何の関数を使えば使えばいいのでしょうか?
宜しくお願いします。


google先生  2008-08-06 23:09:55  No: 31490

http://q.hatena.ne.jp/1111819318
こんなかんじ?


MINI  2008-08-07 05:42:23  No: 31491

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;
//---↑ここまで↑---


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加