マルチプロセッサで各CPUの使用率を取得する

Windowsマルチプロセッサの各CPUの使用率を取得するには、Performance Data Helper(以下PDH)のAPIを使う。

PDHは非常に多機能でWindowsのさまざまなシステム情報を取得できるが、ここではタスクマネージャーに表示されるようなCPUの使用率を取得する方法に絞る。

 

//インクルードするヘッダ

#include <pdh.h>

  

//使う変数の宣言

HQUERY hQuerryCPU;

HCOUNTER hCounterCPU

PDH_FMT_COUNTERVALUE FmtValue;

 

PdhOpenQuery(NULL, 0, &hQuerryCPU);

PdhAddCounter(hQuerryCPU, ”\\Processor(_Total)\\% processor time", 0, &hCounterCPU);

PdhCollectQueryData(hQuerryCPU);

 

"\\Processor(_Total)\\% processor time"はCPUの総計使用率を取得するのに使う。

0番目の論理CPUの使用率を取得するには、 "\\Processor(0)\\% processor time"

最初の PdhCollectQueryData(hQuerryTotal);
を実行してから、データを集計する時間を待つ。たとえばCPUの使用率なら、100msくらい間を置けば取得できる。

その時間が経過したら、 もう一度PdhCollectQueryDataを実行する。

 

PdhCollectQueryData(hQuerryCPU);

PdhGetFormattedCounterValue(hCounterCPU, PDH_FMT_DOUBLE, NULL, &FmtValue); 

 double dLoad = FmtValue.doubleValue;

 

これでdLoadに求めたいCPUの使用率(パーセント)が入る。

 

 

 

 

マルチメディアタイマー

Windows標準のイベントタイマーは精度が低く、最低10ms程度のインターバルしか精度が出ない。それ以下のインターバルのタイマーが欲しければ、マルチメディアタイマーというものがWindows APIに用意されている。使い方は次の通り。

 

#include <mmsystem.h>    /* マルチメディアタイマーに必要 */

//宣言部 

//Callback関数はstaticで且つpublic必須

public:

static void CALLBACK mmTimer(UINT uiID, UINT uiNo, DWORD dwCookie, DWORD dwNo1, DWORD dwNo2);

 

//実装部

//タイマーのコールバック関数

void CALLBACK TForm1::mmTimer(UINT uiID, UINT uiNo, DWORD dwCookie, DWORD dwNo1, DWORD dwNo2)

{

 // タイマーで実行したい内容

}

 

 タイマーイベントのコールバック関数をフォームとかクラスのメンバーとしたい場合は、publicでstaticに宣言しておくのがポイント。

あとは timeSetEvent 関数でタイマーを作成する。timeSetEventを呼んだ後のプロセスの動作を観察してみると、プライオリティ15のスレッドが1個生成される。何も指定しない通常のスレッドはプライオリティ8であるから非常に優先度が高く、高精度が実現されているようである。

 

サンデープログラマの開発環境

 その昔、MSCの値段が数万円していた頃、BorlandのTurbo C++は2万円以下で買えた。数万円のコンパイラを趣味で買うなら、2万円の方に流れるのは当然である。本気でその言語を身に付ける気があるなら、数万円は立派な投資だ・・・が、やはりつらいものはつらい。しかもBorlandコンパイルはMSのより速く、生成された実行コードも速かったのだ。

 Visual StatdioはExpressエディションなら誰でも無料で使える。たいへん良いことだ。しかし64bitビルドとMFCは無料版から抜かれている。プロフェッショナル版なら付いてくるが6万円。一方もとBorland、現エンバカデロC++Builder XE7 Professional ESDは11万円・・・おお、サンデープログラマを死なせないでくれ。

  Webアプリなら「メモ帳で作れるよ」と言われそうだが。

 

ことはじめ

/* サンデープログラマなんて死語になった。プログラマーと言えば業務プログラマーであり、なんかのお仕事でコードを書いているんであり、きっと今日もゴリゴリと書いているんであろう、Java Scriptかなんかで。

 私はそういう人たちをとても尊敬している。このはてなのサービスなんか、どうやって作っているのか私には想像もつかない。きっと説明されてもついていけないに違いない。できないことを出来る人は無条件で尊敬してしまうのである。

 私が職業プログラマにならなかったのは、プログラミングというのは私にとって趣味であり、ホビーであり、つまりは大好きなことなのである。好きなことでメシを喰うのはいいことに聞こえるかもしれないが、好きなことを嫌いになりたくないのである。たとえば、うわさに聞くデスマーチとか経験して、それでソースコードなんか見るも嫌になって、動悸息切れが発生したりジンマシンが出るというような事態になりたくないのである。

 私の本業におけるプログラミングのスキルは、業務にどうしても必要な、一番は自分が欲しいと思ったツール作りの時に発揮される。開発環境も1式揃えてもらっている(バージョンはかなり古くなったが)。作るツールは無くてもなんとかなる話であるが、それがなければ自分も同僚も(そして関係会社も)かなり不便を強いられるというようなツールである。本業でなにか課題を発見し、それを解決するのに自分のプログラミングでなんとかなると思えば、やおらIDEを起動して少しコードを書いてみる。行けそうだと思えば、本腰でゴリゴリ書き始める。あくまで余暇時間で。

 それが完成してもしなくても本業には差し支えないので結果に責任はない。本職の農家と家庭菜園の違いみたいなものかもしれない。それが大違いだということは自覚しているつもりだ。本職の人をとても尊敬している。*/