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

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

[HSP]μモニター情報の分割ソース(2)

2018年09月15日 22時40分03秒 | HSP講座

μモニター情報の分割ソース(2)

//--------------------------------------
// モニター情報の描画
//--------------------------------------
#deffunc DrawMonitor
    ;背景
    gradf 0,0,ginfo_winX,ginfo_winY,1,$00BB00,$002200
    ;外枠
    color $00,$80,$00
    line exWindow,cyWindow,cxWindow,cyWindow
    line exWindow,eyWindow
    line cxWindow,eyWindow
    line cxWindow,cyWindow
    ;情報
    MakeMonitor sMonitor,DESIGN_SW
    SplitChrNum sMonitor,sMonitorChr,sMonitorNum,stat,1000
    color $00,$FF,$00:pos QUAD_SIZE,QUAD_SIZE:mes sMonitorChr
    color $BB,$FF,$BB:pos QUAD_SIZE,QUAD_SIZE:mes sMonitorNum
    return
//--------------------------------------
// 情報文字列の作成
//--------------------------------------
#deffunc MakeMonitor var _buff_,int _sw_
    _buff_=""
    if((_sw_) & FLAG_HDD):_buff_+=strf(" HDD%2d%%",nHDD)
    if((_sw_) & FLAG_CPU):_buff_+=strf(" CPU%2d%%",nCPU)
    if((_sw_) & FLAG_MEM):_buff_+=strf(" MEM%2d%%",nMEM)
    if((_sw_) & FLAG_VRM):_buff_+=strf(" VRM%2d%%",nVRM)
    if((_sw_) & FLAG_PGF):_buff_+=strf(" PGF%2d%%",nPGF)
    if((_sw_) & FLAG_UPB):_buff_+=strf(" UP%sB",MakeSizeUnit(dbUp,1))
    if((_sw_) & FLAG_DNB):_buff_+=strf(" DN%sB",MakeSizeUnit(dbDn,1))
    if((_sw_) & FLAG_UP8):_buff_+=strf(" UP%sbps",MakeBitUnit(dbUp*8,1))
    if((_sw_) & FLAG_DN8):_buff_+=strf(" DN%sbps",MakeBitUnit(dbDn*8,1))
    _buff_=strtrim(_buff_)
    return 0
//--------------------------------------
// 整数型からdouble型を作成
//--------------------------------------
#defcfunc MakeDouble int _p1_,int _p2_,\
    local p1,\
    local p2
    
    if(_p1_<0):p1=(4294967296.0+_p1_):else:p1=double(_p1_)      ;下位32ビット
    if(_p2_<0):p2=(4294967296.0+_p2_):else:p2=double(_p2_)      ;上位32ビット
    return(p2*4294967296.0+p1)
//--------------------------------------
// 4桁ビット単位の文字列を作成
//--------------------------------------
#defcfunc MakeBitUnit double _size_,int _unit_,\
    local nPos,\
    local dbSize,\
    local szSize
    
    dbSize=(_size_)
    ;最低単位
    if(_unit_){
        repeat(_unit_)
            dbSize/=1000.0:nPos++
        loop
    }
    else:if(dbSize<1000.0){
        return strf("%4.f%c",dbSize,SizeUnits(nPos))
    }
    ;単位シフト
    while(dbSize>=1000.0)
        dbSize/=1000.0:nPos++
    wend
    ;補正
    szSize=strf("%f",dbSize)    :poke szSize,4
    if(peek(szSize,3)=='.')     :poke szSize,3
    return strf("%4s%c",szSize,SizeUnits(nPos))
//--------------------------------------
// 4桁バイト単位の文字列を作成
//--------------------------------------
#defcfunc MakeSizeUnit double _size_,int _unit_,\
    local nPos,\
    local dbSize,\
    local szSize
    
    dbSize=(_size_)
    ;最低単位
    if(_unit_){
        repeat(_unit_)
            dbSize/=1024.0:nPos++
        loop
    }
    else:if(dbSize<1024.0){
        return strf("%4.f%c",dbSize,SizeUnits(nPos))
    }
    ;単位シフト
    while(dbSize>=1024.0)
        dbSize/=1024.0:nPos++
    wend
    if(dbSize>=1000.0){
        dbSize/=1024.0:nPos++
    }
    ;補正
    szSize=strf("%f",dbSize)    :poke szSize,4
    if(peek(szSize,3)=='.')     :poke szSize,3
    return strf("%4s%c",szSize,SizeUnits(nPos))
//--------------------------------------
// 文字と数値を分離
//--------------------------------------
#deffunc SplitChrNum var _str_,var _chr_,var _num_,int _chrPos_,int _numPos_
    n=strlen(_str_)
    repeat n
        c=peek(_str_,cnt)
        IsDBCSLeadByte c
        if(stat){
            d=peek(_str_,cnt+1)
            poke(_chr_),(cnt+0),c:poke(_num_),(cnt+0),' '
            poke(_chr_),(cnt+1),d:poke(_num_),(cnt+1),' '
            continue(cnt+2)
        }
        else:if(cnt<_chrPos_){
            poke(_chr_),cnt,c
            poke(_num_),cnt,' '
        }
        else:if(cnt>=_numPos_){
            poke(_chr_),cnt,' '
            poke(_num_),cnt,c
        }
        else:if('0'<=c)and(c<='9')or(c=='.')or(c=='+')or(c=='-'){
            poke(_chr_),cnt,' '
            poke(_num_),cnt,c
        }
        else{
            poke(_chr_),cnt,c
            poke(_num_),cnt,' '
        }
    loop
    poke(_chr_),n
    poke(_num_),n
    return
//--------------------------------------
// PCモニターの初期化
//--------------------------------------
#deffunc InitMonitor
    dim hQuery                          ;問い合わせのハンドル(PDH_HQUERY)
    dim hCounter,4                      ;カウンターのハンドル(PDH_HCOUNTER)
    dim fmtValue,3                      ;取得データの構造体(PDH_FMT_COUNTERVALUE)
    dupptr fmtDouble,varptr(fmtValue(2)),8,vartype("double")
    ;メモリー
    dim msex,DIM_MEMORYSTATUSEX         ;MEMORYSTATUSEXの構造体
    msex(0)=SIZE_MEMORYSTATUSEX         ;MEMORYSTATUSEXの初期化
    dbAvail=0.0                         ;空き容量
    dbTotal=0.0                         ;搭載容量
    return
//--------------------------------------
// PCモニターの後始末
//--------------------------------------
#deffunc TermMonitor onexit
    PdhCloseQuery hQuery
    return
//--------------------------------------
// PCモニターの開始
//--------------------------------------
#deffunc StartMonitor\
    local sEnum1,local nSize1,\
    local sEnum2,local nSize2
    ;オープン
    PdhOpenQuery NULL,0,varptr(hQuery)
    if(stat!=ERROR_SUCCESS):return 0
    ;列挙
    n=10*1024
    sdim sEnum1,n:nSize1=n
    sdim sEnum2,n:nSize2=n
    PdhEnumObjectItems NULL,NULL,"Network Interface",sEnum1,nSize1,sEnum2,nSize2,PERF_DETAIL_WIZARD,0
    ;追加
    PdhAddCounter hQuery,strf("\\LogicalDisk(_Total)\\%% Disk Time"),               0,varptr(hCounter(0))
    PdhAddCounter hQuery,strf("\\Processor(_Total)\\%% Processor Time"),            0,varptr(hCounter(1))
    PdhAddCounter hQuery,strf("\\Network Interface(%s)\\Bytes Sent/sec",    sEnum2),0,varptr(hCounter(2))
    PdhAddCounter hQuery,strf("\\Network Interface(%s)\\Bytes Received/sec",sEnum2),0,varptr(hCounter(3))
    return 1
//--------------------------------------
// PCモニターの収集
//--------------------------------------
#deffunc InfoMonitor
    PdhCollectQueryData hQuery
    GlobalMemoryStatusEx varptr(msex)
    ;物理メモリ量(%)
    dbTotal=MakeDouble(msex.msex_ullTotalPhysLo,msex.msex_ullTotalPhysHi)
    dbAvail=MakeDouble(msex.msex_ullAvailPhysLo,msex.msex_ullAvailPhysHi)
    nMEM=int((dbTotal-dbAvail)*100.0/dbTotal+0.5)
    ;仮想メモリ量(%)
    dbTotal=MakeDouble(msex.msex_ullTotalVirtualLo,msex.msex_ullTotalVirtualHi)
    dbAvail=MakeDouble(msex.msex_ullAvailVirtualLo,msex.msex_ullAvailVirtualHi)
    nVRM=int((dbTotal-dbAvail)*100.0/dbTotal+0.5)
    ;ページング量(%)
    dbTotal=MakeDouble(msex.msex_ullTotalPageFileLo,msex.msex_ullTotalPageFileHi)
    dbAvail=MakeDouble(msex.msex_ullAvailPageFileLo,msex.msex_ullAvailPageFileHi)
    nPGF=int((dbTotal-dbAvail)*100.0/dbTotal+0.5)
    ;HDD使用率(%)
    PdhGetFormattedCounterValue hCounter(0),PDH_FMT_LONG,NULL,varptr(fmtValue)
    nHDD=fmtValue(2)
    ;CPU使用率(%)
    PdhGetFormattedCounterValue hCounter(1),PDH_FMT_LONG,NULL,varptr(fmtValue)
    nCPU=fmtValue(2)
    ;ネット送信量(バイト/秒)
    PdhGetFormattedCounterValue hCounter(2),PDH_FMT_DOUBLE,NULL,varptr(fmtValue)
    dbUp=fmtDouble
    ;ネット受信量(バイト/秒)
    PdhGetFormattedCounterValue hCounter(3),PDH_FMT_DOUBLE,NULL,varptr(fmtValue)
    dbDn=fmtDouble
    ;補正
    if(nHDD>99):nHDD=99
    if(nCPU>99):nCPU=99
    if(nMEM>99):nMEM=99
    if(nVRM>99):nVRM=99
    if(nPGF>99):nPGF=99
    return
//------------------------------------------------------------------------------
// End of sample328b(μモニター情報).hsp
//------------------------------------------------------------------------------

このソースは長くブログの文字数を超えたため分割しました。
前回はμモニター情報のソース(1)をどうぞ。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]μモニター情報の分割... | トップ | [HSP]μウインドウ情報のソース »
最新の画像もっと見る

コメントを投稿

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