23

Win32 API 関数、C++ または Delphi サンプル コードを探して、スレッドの CPU 使用率 (パーセントおよび/または合計 CPU 時間) (プロセスの合計ではない) を教えてくれます。私はスレッドIDを持っています。

Sysinternals Process Explorer がこの情報を表示できることは知っていますが、プログラム内でこの情報が必要です。

4

7 に答える 7

27

これらの関数を使用して、スレッドおよびプロセスごとのCPU使用率を取得する必要があります。

GetThreadTimes(指定されたスレッドのタイミング情報を取得します。)

GetProcessTimes(指定されたプロセスのタイミング情報を取得します。)

GetSystemTime(現在のシステムの日付と時刻を取得します。システム時刻は協定世界時UTCで表されます)

Dobb博士のWin32パフォーマンス測定オプションからの優れた記事がここにあります

さよなら。

于 2009-09-08T10:07:38.237 に答える
11

参照しているデータは、特定のWMI呼び出しを使用して利用できます。Win32_Process をクエリして、あらゆる種類のプロセス固有の情報を取得し、Win32_PerfFormattedData_PerfProc_Process をクエリしてスレッド数を取得し、スレッドへのハンドル (探していると思われるもの) を指定すると、Win32_PerfRawData_PerfProc_Threadをクエリして、使用されているプロセッサ時間の割合を取得できます。

ほとんどの WMI クエリのラッパーを提供するDelphi 用のライブラリがありますが、探している正確なクエリを取得するには、ある程度の実験が必要です。クエリ構文は非常に sql に似ています。たとえば、私のシステムでは、プロセス ID 4 のスレッド ID 8 のプロセッサ時間の割合を返します。

SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread 
  WHERE IdProcess=4 and IdThread=8

現在、実行中のプロセスに関する統計情報を提供するプログラムのほとんどは、WMI を使用してこの情報を照会しています。

于 2009-09-08T18:21:40.017 に答える
8

特定の状況では、スレッドの実行時間が無駄になる可能性があることを知っておくことが重要です。各スレッドの実行時間は、通常、マルチコア システムでは 15 ミリ秒ごとに更新されるため、スレッドがこの時間より前にタスクを完了すると、ランタイムがリセットされます。詳細については、次のリンクを参照してください: GetThreadTimes 関数。その結果には驚きました。GetThreadTimes が間違っている
理由

于 2009-11-19T12:49:10.233 に答える
6

上記のRRUZの回答の助けを借りて、私は最終的にBorland Delphiのこのコードを思いつきました:

const
  THREAD_TERMINATE                 = $0001;
  THREAD_SUSPEND_RESUME            = $0002;
  THREAD_GET_CONTEXT               = $0008;
  THREAD_SET_CONTEXT               = $0010;
  THREAD_SET_INFORMATION           = $0020;
  THREAD_QUERY_INFORMATION         = $0040;
  THREAD_SET_THREAD_TOKEN          = $0080;
  THREAD_IMPERSONATE               = $0100;
  THREAD_DIRECT_IMPERSONATION      = $0200;
  THREAD_SET_LIMITED_INFORMATION   = $0400;
  THREAD_QUERY_LIMITED_INFORMATION = $0800;
  THREAD_ALL_ACCESS                = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $03FF;

function OpenThread(dwDesiredAccess: DWord;
                    bInheritHandle: Bool;
                    dwThreadId: DWord): DWord; stdcall; external 'kernel32.dll';


procedure TForm1.Button1Click(Sender: TObject);
var iii:integer;
    handle:thandle;
    creationtime,exittime,kerneltime,usertime:filetime;
begin
  Handle:=OpenThread(THREAD_SET_INFORMATION or THREAD_QUERY_INFORMATION, False, windows.GetCurrentThreadId);
  if handle<>0 then
  begin
    getthreadtimes(Handle,creationtime,exittime,kerneltime,usertime);
    label1.caption:='Total time for Thread #'+inttostr(windows.GetCurrentThreadId)+': '+inttostr( (int64(kerneltime)+int64(usertime)) div 1000 )+' msec';
    CloseHandle(Handle);
  end;
end;
于 2009-09-08T22:16:04.863 に答える
4

「GetThreadTimes」を使用していますか? 「GetThreadTimes」への呼び出し間の時間を測定し、以前のユーザーおよび/またはカーネルの時間を保存すると、最後にチェックしてからスレッドにかかった時間がわかります。また、平均時間の経過時間もわかるため、使用された CPU 時間も計算できます。(タイマー解決の理由から) 1 秒ごとにこのチェックを行い、その 1 秒間の平均 CPU 使用率を計算するのが最善です。

于 2009-09-08T09:45:18.530 に答える
1

以下は単純な WMI クエリ ラッパーです。これを使用して、これを呼び出してデータを取得できます。

getWmiQueryResult(L"SELECT PercentProcessorTime FROM Win32_PerfRawData_PerfProc_Thread WHERE IdProcess=4 and IdThread=8", L"PercentProcessorTime ");

また、Win32_PerfRawData_PerfProc_Threadのドキュメントを参照して、フェッチできるその他のプロパティを確認することもできます。

于 2018-02-13T13:18:05.997 に答える