4

私は現在、CPU 使用率を認識する必要がある MFC アプリケーションに取り組んでいます。異なる時点で複数のスレッドが存在する場合がありますが、作業の大部分はメイン スレッドによって実行されます。

このメイン スレッドが使用する CPU の割合を計算する方法を見つけようとしています。ただし、マルチ CPU / マルチコア環境でこれを正確に達成する方法について、いくつかの問題に直面しています。問題は、ほとんどのシステム コールがシステム情報を提供しているように見えるのに対し、私はメイン スレッドが実行されているプロセッサに固有の情報を必要としているということです。

私は WMI を調べましたが、このタスクにはやり過ぎのようです。GetThreadTimes() は必要なものに対して機能しますか?

4

1 に答える 1

7

メインスレッドは異なるCPUで異なる時間に実行される可能性があるため、「メインスレッドが実行されているプロセッサに固有の情報」は無意味である可能性があります。すべてのプロセッサである可能性があります。Windowsは、スレッドがどのCPUで実行されたかを追跡しないため、「CPUごとのこのスレッドの実行時間のリストを教えてください」と尋ねることはできません。唯一の例外は、スレッドアフィニティマスクを単一のCPUに設定した場合です。その場合、スレッドが実行されたとしても、その単一のCPUで実行されることを確認できます。

ランタイムの計算には、GetThreadTimesが適切なAPIです。プロセスが(理論上の)CPUの何パーセントを使用したかを知りたい場合は、次のように計算します。

(kerneltime+usertime) / (now - starttime) / numberofcpus

もちろん、この式は、すべてのCPUの速度が同じであることを前提としています。スレッドが最近消費したCPU部分を表示する場合は、毎秒GetThreadTimesをサンプリングしてから、計算します。

(usedtimenow - usedtimeprevious) / (now - previous) / numberofcpus

毎秒サンプリングする場合、現在-以前はおよそ1になりますが、とにかくサンプリングの時間を記録する必要があります-システムはサンプル間で正確に1秒スリープさせない可能性があります。

于 2008-11-04T05:23:31.660 に答える