μモニター情報の分割ソース(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)をどうぞ。
関連記事
- μデジタル時計のソース
- μモニター情報のソース 、分割(1) 、分割(2)
- μウインドウ情報のソース
※コメント投稿者のブログIDはブログ作成者のみに通知されます