プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]マルチコアCPU使用率のサンプル(3)

2017年09月17日 03時02分00秒 | HSP講座

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)


ここには、マルチコアCPUに対応したCPU使用率のサンプル・ソースを載せておきます。
Win32API 関数のパフォーマンス・カウンタ群を使います。

また、CPUコア数をチェックして表示するプログレスバーの数を調節してます。
さらに使いやすいように4つのユーザー定義命令を作って利用します。

  1. CPU使用率の初期化 (InitCPU命令)
  2. CPU使用率の後始末 (TermCPU命令)
  3. CPU使用率の収集 (GetCPU命令)
  4. CPU使用率の描画 (DrawCPU命令)

前回の「マルチコアCPU使用率のサンプル(2)」のプログレスバーの描画部分だけを機能拡張してます。
それ以外のソースに変更はありません。

つまり、DrawCPU 命令の DrawProgressGray 命令と DrawProgressGreen 命令から
DrawProgressCore 命令と DrawProgressTotal 命令の2つに変更してます。
この2つのユーザー定義命令は、内部で次のカラー・プログレスバーの命令を呼び出してます。

  1. 灰色プログレスバーの描画 (DrawProgressGray命令)
  2. 緑色プログレスバーの描画 (DrawProgressGreen命令)
  3. 黄色プログレスバーの描画 (DrawProgressYellow命令)
  4. 赤色プログレスバーの描画 (DrawProgressRed命令)
  5. 水色プログレスバーの描画 (DrawProgressCyan命令)
//--------------------------------------
// コアCPUプログレスバーの描画
//--------------------------------------
#deffunc DrawProgressCore int _cx_,int _cy_,int _ratio_
    DrawProgressGray(_cx_),(_cy_),100
    if(_ratio_)>100:return
    if(_ratio_)>=90:DrawProgressRed     (_cx_),(_cy_),(_ratio_):return
    if(_ratio_)>=70:DrawProgressYellow  (_cx_),(_cy_),(_ratio_):return
    if(_ratio_)>= 0:DrawProgressGreen   (_cx_),(_cy_),(_ratio_):return
    return

上記のソースを見ると分かりますが、パーセント値によって描画されるプログレスバーの色が変わります。
つまり、0%~%69%は「緑色」、70%~89%は「黄色」、90%~100%は「赤色」となり、
無効なパーセント値であるマイナス値、または101%以上は「灰色」となります。

技術資料

関連カテゴリ

動作確認のサンプル

管理上このサンプルは sample204c(マルチコアのCPU使用率サンプル).hsp のソースです。

//------------------------------------------------------------------------------
// マルチコアのCPU使用率サンプル(3) by 科学太郎
//==============================================================================
// @URL(https://msdn.microsoft.com/ja-jp/library/cc429557.aspx)→「PdhOpenQuery」
// @URL(https://msdn.microsoft.com/en-us/library/aa372558.aspx)→「PdhCloseQuery」
// @URL(https://msdn.microsoft.com/en-us/library/aa372204.aspx)→「PdhAddCounter」
// @URL(https://msdn.microsoft.com/en-us/library/aa372563.aspx)→「PdhCollectQueryData」
// @URL(https://msdn.microsoft.com/ja-jp/library/cc429547.aspx)→「PdhGetFormattedCounterValue」
// @URL(https://msdn.microsoft.com/en-us/library/aa373050.aspx)→「PDH_FMT_COUNTERVALUE」
//------------------------------------------------------------------------------

//--------------------------------------
// Win32API関数の呼び出し定義
//--------------------------------------
#uselib "Pdh.dll"
#func global PdhOpenQuery                   "PdhOpenQueryA"                 sptr,sptr,sptr
#func global PdhCloseQuery                  "PdhCloseQuery"                 sptr
#func global PdhAddCounter                  "PdhAddCounterA"                sptr,sptr,sptr,sptr
#func global PdhCollectQueryData            "PdhCollectQueryData"           sptr
#func global PdhGetFormattedCounterValue    "PdhGetFormattedCounterValue"   sptr,sptr,sptr,sptr

//--------------------------------------
// 記号定数(API定数)
//--------------------------------------
#const global NULL                      0
#const global ERROR_SUCCESS             $00000000
#const global PDH_FMT_LONG              $00000100

//--------------------------------------
// 列挙定数(ウインドウID)
//--------------------------------------
#enum WID_MAIN=0

//--------------------------------------
// 記号定数(サイズ)
//--------------------------------------
#const FONT_SIZE        (16)
#const HALF_SIZE        (FONT_SIZE/2)
#
#const PROGRESS_XSIZE   (500)
#const PROGRESS_YSIZE   (16)
#
#const WINDOW_XSIZE     (FONT_SIZE*4+PROGRESS_XSIZE+FONT_SIZE*3)
#const WINDOW_YSIZE     (FONT_SIZE*2*16)

//--------------------------------------
// メイン部
//--------------------------------------
*Init
    CoreMax=sysinfo(17)
*Main
    screen WID_MAIN,WINDOW_XSIZE,WINDOW_YSIZE,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_HIDE
    syscolor 15:boxf:color:title "マルチコアのCPU使用率サンプル(3) by 科学太郎"
    font MSGOTHIC,FONT_SIZE
    ;設定
    onexit gosub *OnQuit
    ;初期化
    InitCPU CoreMax
    if(stat==0):gsel WID_MAIN,1:dialog "クエリーをオープンできません。",1,"確認":end
    ;サイズ
    sx=(ginfo_winX)
    sy=(FONT_SIZE*2)*(CoreMax+1)
    width sx,sy
    ;表示
    gsel WID_MAIN,1
    repeat
        redraw 0
        GetCPU
        DrawCPU
        redraw 1
        await 1000
    loop
    stop
//--------------------------------------
// 終了時の割り込み処理
//--------------------------------------
*OnQuit
    oncmd 0:TermCPU:end
    return
//--------------------------------------
// CPU使用率の初期化
//--------------------------------------
#deffunc InitCPU int _max_
    dim hQuery                          ;問い合わせのハンドル(PDH_HQUERY)
    dim hCounter,1                      ;カウンターのハンドル(PDH_HCOUNTER)
    dim fmtValue,3                      ;取得データの構造体(PDH_FMT_COUNTERVALUE)
    ;初期化
    PdhOpenQuery NULL,0,varptr(hQuery)
    if(stat!=ERROR_SUCCESS):return 0
    ;追加
    repeat(_max_)
        PdhAddCounter hQuery,strf("\\Processor(%d)\\%% Processor Time",cnt),0,varptr(hCounter(cnt))
    loop
    PdhAddCounter hQuery,"\\Processor(_Total)\\% Processor Time",0,varptr(hCounter(_max_))
    ;開始
    PdhCollectQueryData hQuery
    return 1
//--------------------------------------
// CPU使用率の後始末
//--------------------------------------
#deffunc TermCPU
    PdhCloseQuery hQuery
    return
//--------------------------------------
// CPU使用率の収集
//--------------------------------------
#deffunc GetCPU
    PdhCollectQueryData hQuery
    return
//--------------------------------------
// CPU使用率の描画
//--------------------------------------
#deffunc DrawCPU\
    local x1,\
    local x2,\
    local x3,\
    local yy,\
    local ratio
    ;背景
    gradf 0,0,ginfo_winX,ginfo_winY,1,$006699,$000066
    ;コア毎
    x1=HALF_SIZE
    x2=FONT_SIZE*4
    x3=FONT_SIZE*4+PROGRESS_XSIZE+HALF_SIZE
    yy=HALF_SIZE
    repeat CoreMax
        PdhGetFormattedCounterValue hCounter(cnt),PDH_FMT_LONG,NULL,varptr(fmtValue)
        s=strf("コア#%d",cnt)
        color $00,$00,$00:pos(x1+1),(yy+1):mes s
        color $FF,$FF,$FF:pos(x1+0),(yy+0):mes s
        s=strf("%3d%%",fmtValue(2))
        color $00,$00,$00:pos(x3+1),(yy+1):mes s
        color $FF,$FF,$FF:pos(x3+0),(yy+0):mes s
        DrawProgressCore x2,yy,fmtValue(2)
        yy+=FONT_SIZE*2
    loop
    ;全体
    PdhGetFormattedCounterValue hCounter(CoreMax),PDH_FMT_LONG,NULL,varptr(fmtValue)
    s="全体的"
    color $00,$00,$00:pos(x1+1),(yy+1):mes s
    color $FF,$FF,$FF:pos(x1+0),(yy+0):mes s
    s=strf("%3d%%",fmtValue(2))
    color $00,$00,$00:pos(x3+1),(yy+1):mes s
    color $FF,$FF,$FF:pos(x3+0),(yy+0):mes s
    DrawProgressTotal x2,yy,fmtValue(2)
    return
//--------------------------------------
// コアCPUプログレスバーの描画
//--------------------------------------
#deffunc DrawProgressCore int _cx_,int _cy_,int _ratio_
    DrawProgressGray(_cx_),(_cy_),100
    if(_ratio_)>100:return
    if(_ratio_)>=90:DrawProgressRed     (_cx_),(_cy_),(_ratio_):return
    if(_ratio_)>=70:DrawProgressYellow  (_cx_),(_cy_),(_ratio_):return
    if(_ratio_)>= 0:DrawProgressGreen   (_cx_),(_cy_),(_ratio_):return
    return
//--------------------------------------
// 全体CPUプログレスバーの描画
//--------------------------------------
#deffunc DrawProgressTotal int _cx_,int _cy_,int _ratio_
    DrawProgressGray(_cx_),(_cy_),100
    if(_ratio_)>100:return
    if(_ratio_)>=90:DrawProgressRed     (_cx_),(_cy_),(_ratio_):return
    if(_ratio_)>=70:DrawProgressYellow  (_cx_),(_cy_),(_ratio_):return
    if(_ratio_)>= 0:DrawProgressCyan    (_cx_),(_cy_),(_ratio_):return
    return
//--------------------------------------
// 灰色プログレスバーの描画
//--------------------------------------
#deffunc DrawProgressGray int _cx_,int _cy_,int _ratio_
    sx=(_ratio_)*PROGRESS_XSIZE/100
    sy=(PROGRESS_YSIZE/2)
    gradf(_cx_),(_cy_+ 0),sx,sy,1,$808080,$C0C0C0
    gradf(_cx_),(_cy_+sy),sx,sy,1,$606060,$202020
    return
//--------------------------------------
// 緑色プログレスバーの描画
//--------------------------------------
#deffunc DrawProgressGreen int _cx_,int _cy_,int _ratio_
    sx=(_ratio_)*PROGRESS_XSIZE/100
    sy=(PROGRESS_YSIZE/2)
    gradf(_cx_),(_cy_+ 0),sx,sy,1,$99CC00,$CCFFCC
    gradf(_cx_),(_cy_+sy),sx,sy,1,$99CC99,$006600
    return
//--------------------------------------
// 黄色プログレスバーの描画
//--------------------------------------
#deffunc DrawProgressYellow int _cx_,int _cy_,int _ratio_
    sx=(_ratio_)*PROGRESS_XSIZE/100
    sy=(PROGRESS_YSIZE/2)
    gradf(_cx_),(_cy_+ 0),sx,sy,1,$FFFF00,$FFFFCC
    gradf(_cx_),(_cy_+sy),sx,sy,1,$CCCC00,$333300
    return
//--------------------------------------
// 赤色プログレスバーの描画
//--------------------------------------
#deffunc DrawProgressRed int _cx_,int _cy_,int _ratio_
    sx=(_ratio_)*PROGRESS_XSIZE/100
    sy=(PROGRESS_YSIZE/2)
    gradf(_cx_),(_cy_+ 0),sx,sy,1,$FF0000,$FFCCCC
    gradf(_cx_),(_cy_+sy),sx,sy,1,$CC0000,$330000
    return
//--------------------------------------
// 水色プログレスバーの描画
//--------------------------------------
#deffunc DrawProgressCyan int _cx_,int _cy_,int _ratio_
    sx=(_ratio_)*PROGRESS_XSIZE/100
    sy=(PROGRESS_YSIZE/2)
    gradf(_cx_),(_cy_+ 0),sx,sy,1,$00DDFF,$CCFFFF
    gradf(_cx_),(_cy_+sy),sx,sy,1,$00CCCC,$003366
    return
//------------------------------------------------------------------------------
// End of sample204c.hsp
//------------------------------------------------------------------------------

スクリーン・ショット

  • パーセント値によって描画されるプログレスバーの色が変わります。
  • 0%~%69%は「緑色」、70%~89%は「黄色」、90%~100%は「赤色」となります。
  • 無効なパーセント値であるマイナス値、または101%以上は「灰色」となります。

関連記事



コメント   この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]マルチコアCPU使用率... | トップ | [HSP]ディスク使用率のサン... »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事