|
|
2014/11/21(Fri) 19:30:21|NO.66119
今ちょっとしたソフトを作成しているのですが
HDD使用率などの取得サンプルはあるものの、HDDアクセス率のサンプルがどこにもありません。
前のPCがWindows8でタスクマネージャーのHDDアクセス率が便利だったのですが、
やはりWindows8以降でないとアクセス率は取得出来ないのでしょうか?
|
|
2014/11/21(Fri) 20:08:26|NO.66121
|
|
2014/11/21(Fri) 20:38:41|NO.66122
とりあえず、Windows7にもhddの読み取り機能はあります。
確か98頃からあったような..
タスクマネージャーの表示が変わっただけです。
試していないし、できるかどうかもわからないけど予想
1、タスクマネージャーがDLLや別のアプリケーションから情報取得しているのなら
それを実行し、HSPに何らかの方法で流し込む。
2、なんとなくエクスプローラー関連でありそう
3、MSDNライブラリを探して見るとありそう
4、あったとしてもリアルタイムで動いているアクセス情報がどのように送られてくるかが不明
|
|
2014/11/21(Fri) 21:35:54|NO.66124
|
|
2014/11/21(Fri) 22:38:33|NO.66125
物理ディスクの読み書きの情報を取得するモジュールを作ってみました。
コマンドプロンプトを使用しており、リアルタイム性はほぼ0です。
それとみなさんの環境で動作するかは分かりません。
<方法>
1.「typeperf -qx PhysicalDisk | find /i "total" | find /i "av"」で物理ディスクのモニタ可能な項目を取得
2.「typeperf -sc 1 "【1.で取得した情報】"」でその情報を1回だけモニタリング。
取得にはそこそこ時間がかかります。
#module "mod_FscDskInf"
;#include "hspext.as" ; hspext を使用
// GetPhysicalDisk ... 物理ディスクを全て取得
// p1 : 名前を代入する配列変数
// [返り値] : 失敗=-1 / 成功=配列の数
#deffunc GetPhysicalDisk array perf
// 物理ディスクでモニタリングできる情報を取得
sdim out, 2048
if Misc_Pipe( "typeperf -qx PhysicalDisk | find /i \"total\" | find /i \"av\"", out ) == 0 : return -1
/* pipeexecではなぜか取得できない
sdim out, 2048 : pipeexec out, {"typeperf -qx PhysicalDisk | find /i "total" | find /i "av""}, 1
if stat : return -1
sdim pipe, 1024
repeat
await 1
pipeget pipe
if stat == 0 : break
loop
;*/
split out, "\n", perf
perf(stat) = ""
return stat-1
// GetPhysicalDisk ... 物理ディスクの指定した情報取得
// p1 : パフォーマンスモニタでの名前
// [返り値] : -1=失敗 / 0=成功
#deffunc GetPhysicalDisks str dName, var ret
sdim out, 2048 : sdim ret, 64
if Misc_Pipe( "typeperf -sc 1 \"" + dName + "\"", out ) == 0 : return -1
notesel out : noteget out, 2 ; たぶん3行目から結果
repeat 3
tmp_int = instr(out, 0, "\"")
out = strmid(out, tmp_int+1, strlen(out)-tmp_int)
loop
ret = strmid(out, 0, strlen(out)-1)
return 0
// 以下 fortunehill 様のパイプ付き実行関数
#uselib "kernel32.dll"
#func __GetEnvironmentVariableA "GetEnvironmentVariableA" sptr,sptr,sptr
#func __CreatePipe "CreatePipe" sptr,sptr,sptr,sptr
#func __CreateProcessA "CreateProcessA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func __WaitForSingleObject "WaitForSingleObject" sptr,sptr
#func __PeekNamedPipe "PeekNamedPipe" sptr,sptr,sptr,sptr,sptr,sptr
#func __CloseHandle "CloseHandle" sptr
#func __ReadFile "ReadFile" sptr,sptr,sptr,sptr,sptr
#defcfunc Misc_Pipe str p1,array p2,local ss,local ii,local jj,local hh,local nn,local rr
sdim ss,512 :ss = "COMSPEC"
__GetEnvironmentVariableA varptr(ss),varptr(ss),512 : if (stat == 0) {return 0} : jj = 12,0,1 :ss += " /c "+p1
__CreatePipe varptr(hh),varptr(nn),varptr(jj),262144 : dim jj, 17 :ii = 68,0,0,0 : jj(11) = $101,0,0,nn,nn,nn
__CreateProcessA 0,ss,0,0,1,0,0,0,varptr(jj),varptr(ii) : if (stat == 0) {return 0} :__CloseHandle ii(1)
__WaitForSingleObject ii,-1 :__CloseHandle nn: sdim p2,262144 :await 20
__PeekNamedPipe hh,0,0,0,varptr(jj),0 :__ReadFile hh, varptr(p2),jj,varptr(rr),0 :__CloseHandle hh
return rr
#global
/*----- ここまでモジュール -----*/
mes "データを収集しています..."
// 一応初期化
sdim fDisk : sdim ret
// 全情報取得
GetPhysicalDisk fDisk
if stat == -1 : mes "データの取得に失敗しました。" : stop
mes "\n各種情報を表示します。\n"
// 各種情報取得
repeat stat
GetPhysicalDisks fDisk(cnt), ret
// 表示
mes "" + fDisk(cnt) + " : " + ret
loop
mes "\n取得した全ての情報を表示しました。"
stop
とりあえず真っ先に思いついて書けたので挙げておきます。
| |
|
2014/11/21(Fri) 22:53:43|NO.66127
一年ぐらい前に作って放置してたモジュールだけど・・・
#module "mod_PdhPC"
#uselib "Pdh"
#func PdhOpenQuery "PdhOpenQuery" int,int,var
#func PdhCloseQuery "PdhCloseQuery" sptr
#func PdhGetDllVersion "PdhGetDllVersion" sptr
#func PdhCollectQueryData "PdhCollectQueryData"sptr
#func PdhAddCounter "PdhAddCounterA" sptr,sptr,sptr,sptr
#func PdhGetFormattedCounterValue "PdhGetFormattedCounterValue" sptr,sptr,sptr,sptr
#func PdhExpandWildCardPath "PdhExpandWildCardPathA" sptr,sptr,sptr,sptr,sptr
#func PdhMakeCounterPath "PdhMakeCounterPathA" sptr,sptr,sptr,sptr
#func PdhEnumObjectItems "PdhEnumObjectItemsA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func PdhGetFormattedCounterArray "PdhGetFormattedCounterArrayA" sptr,sptr,sptr,sptr,sptr
#func PdhRemoveCounter "PdhRemoveCounter" sptr
#func PdhGetCounterInfo "PdhGetCounterInfoA" sptr,sptr,sptr,sptr
#func PdhGetDefaultPerfObject "PdhGetDefaultPerfObjectA" sptr,sptr,sptr,sptr
#func PdhParseInstanceName "PdhParseInstanceNameA" sptr,sptr,sptr,sptr,sptr,sptr
#func PdhEnumObjects "PdhEnumObjectsA" sptr,sptr,sptr,sptr,sptr,sptr
#func PdhParseCounterPath "PdhParseCounterPathA" sptr,sptr,sptr,sptr
#func PdhIsRealTimeQuery "PdhIsRealTimeQuery" sptr
#func PdhExpandCounterPath "PdhExpandCounterPathA" sptr,sptr,sptr
//CPUPerformanceCounter用の定数マクロ
#const global P_INTERRUPT_TIME 3
#const global P_IDLE_TIME 4
#const global P_C1_TIME 5
#const global P_C2_TIME 6
#const global P_C3_TIME 7
#const global INTERRUPTS_SEC 8
#const global DPCS_QUEUED_SEC 9
#const global DPC_RATE 10
#const global C1_TRANSITIONS_SEC 11
#const global C2_TRANSITIONS_SEC 12
#const global C3_TRANSITIONS_SEC 13
//CPUPerformanceCounterやProcessPerformanceCounterで使用する定数マクロ
#const global P_PROCESSOR_TIME 0
#const global P_USER_TIME 1
#const global P_PRIVILEGED_TIME 2
//ProcessPerformanceCounter用の定数マクロ
#const global VIRTUAL_BYTES_PEAK 3
#const global VIRTUAL_BYTES 4
#const global PAGE_FAULTS_SEC 5
#const global WORKING_SET_PEAK 6
#const global WORKING_SET 7
#const global PAGE_FILE_BYTES_PEAK 8
#const global PAGE_FILE_BYTES 9
#const global PRIVATE_BYTES 10
#const global THREAD_COUNT 11
#const global PRIORITY_BASE 12
#const global ELAPSED_TIME 13
#const global ID_PROCESS 14
#const global CREATING_PROCESS_ID 15
#const global POOL_PAGED_BYTES 16
#const global POOL_NONPAGED_BYTES 17
#const global HANDLE_COUNT 18
#const global IO_READ_OPERATIONS_SEC 19
#const global IO_WRITE_OPERATIONS_SEC 20
#const global IO_DATA_OPERATIONS_SEC 21
#const global IO_OTHER_OPERATIONS_SEC 22
#const global IO_READ_BYTES_SEC 23
#const global IO_WRITE_BYTES_SEC 24
#const global IO_DATA_BYTES_SEC 25
#const global IO_OTHER_BYTES_SEC 26
/*
#define global PDH_FMT_LONG 0x00000100
#define global PDH_FMT_DOUBLE 0x00000200
#define global PDH_FMT_LARGE 0x00000400
#define global PDH_FMT_NOSCALE 0x00001000
#define global PDH_FMT_1000 0x00002000
#define global PDH_FMT_NOCAP100 0x00008000
*//*
#define global PERF_DETAIL_NOVICE 100
#define global PERF_DETAIL_ADVANCED 200
#define global PERF_DETAIL_EXPERT 300
#define global PERF_DETAIL_WIZARD 400
#define global PDH_NO_DATA 0x800007D5
#define global PDH_CSTATUS_NO_OBJECT 0xc0000bb8
#define global PDH_CSTATUS_NO_COUNTER 0xc0000bb9
#define global PDH_CSTATUS_BAD_COUNTERNAME 0xc0000bc0
#define global PDH_MEMORY_ALLOCATION_FAILURE 0xC0000BBB
#define global PDH_INVALID_HANDLE 0xC0000BBC
#define global PDH_INVALID_ARGUMENT 0xC0000BBD
*/
//--------カウンタフルパスから追加されてるCounterID取得------
//[変数 = GetCounterID(Object, Instance, Counter)]
//パラメータの指定はSetCounterID()を参照
//戻り値=[-1だった場合そのカウンタパスは登録されていない、-2の場合登録はされてるがカウンタは稼働していない]
#define global ctype GetCounterID(%1,%2="",%3="") GetSetCounterID(%1,%2,%3,0)
//--------カウンタフルパスのCounterID登録取得------ローカルマクロなので通常使う事は無い
//[変数 = SetCounterID(Object, Instance, Counter)]
// Object =オブジェクト名(省略不可)["Processor" "Process" "Thread" "Memory" "Paging File" "PhysicalDisk" など、他にもあるが詳しくは知らない]※"\\Process(notepad#0)\\% Processor Time"のような指定も可能(この場合Instance, Counterは省略するか""に)
// Instance =インスタンス名(省略時"")[実行されてるファイル名から拡張子を取り除いたものと同じ]
// Counter =カウンタ(省略時"")["% Processor Time"等あるがObjectにより指定できるカウンタが決まってる]※GetInstanceCounterListで何が使えるか取得できる
//戻り値=[登録された時は新しいID、既に登録されているならそのID]
#define ctype SetCounterID(%1,%2="",%3="") GetSetCounterID(%1,%2,%3,1)
//--------カウンタフルパスからCounterID取得と登録------これはSetCounterID()、GetCounterID()のマクロ用の関数
//[変数 = GetSetCounterID( Object, Instance, Counter, GetSet_cf)]
//Object, Instance, Counterのパラメータの指定はSetCounterID()を参照
// GetSet_cf =取得か登録かのフラグ[0=取得モード 1=登録モード]
#defcfunc GetSetCounterID str Object,str Instance,str Counter,int GetSet_cf
if Instance="" {
if Counter="" {
path=Object
if instr(path,0,"\\")!0 {path="\\"+Object}
}else{
opath=Object
cpath=Counter
if instr(opath,0,"\\")=-1 {path="\\"+Object}else{path=Object}
if instr(cpath,0,"\\")=-1 {path+"\\"+Counter}else{path+Counter}
}
}else{
opath=Object
cpath=Counter
if instr(opath,0,"\\")=-1 {path="\\"+Object}else{path=Object}
if "*"=Instance {path+"(*/*)"}else{path+"("+Instance+")"}
if instr(cpath,0,"\\")=-1 {path+"\\"+Counter}else{path+Counter}
}
if vartype(instr_PathList)=4 {instr_PathList=""}
temp_Object="<"+getpath(path,16)+">"
index=instr(instr_PathList,0,temp_Object)
if index>=0 {
CounterID=path_index_ID(index)
if GetSet_cf=0 and hPerformanceCounter(CounterID)=0 {str_Path=path:return -2}
}else{
if GetSet_cf=0 {str_Path=path:return -1}
path_index_ID(strlen(instr_PathList))=CounterID_MAX
instr_PathList+temp_Object
PathList(CounterID_MAX)=path
CounterID=CounterID_MAX
hPerformanceCounter(CounterID)=0
strf_fmt(CounterID)=""
pc_div(CounterID)=1.0
pdh_fmt(CounterID)= 0x00000200 | 0x00008000 //PDH_FMT_DOUBLE|PDH_FMT_NOCAP100
ins_total(CounterID)=0
ALL_CounterMode(CounterID)=0
CounterID_MAX++
}
return CounterID
//-------CPUのパフォーマンスカウンタを設定--------
//[変数 = AddCPUPerformanceCounter( id, ctyp_pstr)]
// id =クエリーID指定(省略時0)[同じIDを指定して複数のカウンタを追加できる]
// ctyp_pstr =カウンタタイプを指定(省略時0)[0〜8 P_PROCESSOR_TIME等のマクロや"% Processor Time"等のカウンタ名で指定可能]
//登録成功時はstatに新しいカウンタID、既に登録されているならそのカウンタID [ -1ならカウンタに間違いがあった]
#define global ctype AddCPUPerformanceCounter(%1=0,%2=0) _AddCPUPerformanceCounter( %1,str(%2))
#defcfunc _AddCPUPerformanceCounter int id,str ctyp_pstr
if vartype(CPUCounterType)=4 {
CPUCounterType="% Processor Time","% User Time","% Privileged Time","% DPC Time","% Interrupt Time","% Idle Time","% C1 Time","% C2 Time","% C3 Time"
CPUCounterType(Interrupts_sec)="Interrupts/sec","DPCs Queued/sec","DPC Rate","C1 Transitions/sec","C2 Transitions/sec","C3 Transitions/sec"
}
str_Counter=ctyp_pstr
if peek(str_Counter,0)<='9' and peek(str_Counter,0)>='0' {
ctyp_int=int(ctyp_pstr)
if ctyp_int>C3_Transitions_sec or ctyp_int<0 {dialog "CPUPerformanceCounterに\nこのカウンタタイプが存在しません\nctyp="+ctyp_int:return -1}
return _AddPerformanceCounter( id,"\\Processor(*/*)\\"+CPUCounterType(ctyp_int),"","",0)
}
return _AddPerformanceCounter( id,"\\Processor(*/*)\\"+str_Counter,"","",0 )
//-------プロセスのパフォーマンスカウンタを設定--------
//[変数 = AddProcessPerformanceCounter( id, ctyp_pstr)]
// id =クエリーID指定(省略時0)[同じIDを指定して複数のカウンタを追加できる]
// ctyp_pstr =カウンタタイプを指定(省略時0)[0〜16 P_PROCESSOR_TIME等のマクロや"% Processor Time"等のカウンタ名で指定可能]
//登録成功時はstatに新しいカウンタID、既に登録されているならそのカウンタID [ -1ならカウンタに間違いがあった]
#define global ctype AddProcessPerformanceCounter(%1=0,%2=0) _AddProcessPerformanceCounter( %1,str(%2))
#defcfunc _AddProcessPerformanceCounter int id,str ctyp_pstr
if vartype(PerformanceCounterType)=4 {
PerformanceCounterType="% Processor Time","% User Time","% Privileged Time"
PerformanceCounterType(VIRTUAL_BYTES_PEAK)="Virtual Bytes Peak","Virtual Bytes","Page Faults/sec","Working Set Peak","Working Set","Page File Bytes Peak","Page File Bytes","Private Bytes","Thread Count","Priority Base","Elapsed Time","ID Process","Creating Process ID","Pool Paged Bytes","Pool Nonpaged Bytes","Handle Count","IO Read Operations/sec","IO Write Operations/sec","IO Data Operations/sec","IO Other Operations/sec","IO Read Bytes/sec","IO Write Bytes/sec","IO Data Bytes/sec","IO Other Bytes/sec"
}
str_Counter=ctyp_pstr
if peek(str_Counter,0)<='9' and peek(str_Counter,0)>='0' {
ctyp_int=int(ctyp_pstr)
if ctyp_int>IO_OTHER_BYTES_SEC or ctyp_int<0 {dialog "ProcessPerformanceCounterに\nこのカウンタタイプが存在しません\nctyp="+ctyp_int:return -1}
return _AddPerformanceCounter( id,"\\Process(*/*)\\"+PerformanceCounterType(ctyp_int),"","",1)
}
return _AddPerformanceCounter( id,"\\Process(*/*)\\"+str_Counter,"","",1)
//-------オブジェクト、インスタンス、カウンタを指定してパフォーマンスカウンタをクエリーに追加--------
//[変数 = AddPerformanceCounter( id, Object, Instance, Counter)]
// id =クエリーID指定(省略不可)[同じIDを指定して複数のカウンタを追加できる]
// Object =オブジェクト名(省略不可)["Processor" "Process" "Thread" "Memory" "Paging File" "PhysicalDisk" など、他にもあるが詳しくは知らない]※"\\Process(notepad#0)\\% Processor Time"のような指定も可能(この場合Instance, Counterは省略するか""に)
// Instance =インスタンス名(省略時"")[実行されてるファイル名から拡張子を取り除いたものと同じ]
// Counter =カウンタ(省略時"")["% Processor Time"等あるがObjectにより指定できるカウンタが決まってる]※GetInstanceCounterListで何が使えるか取得できる
//登録成功時はstatに新しいカウンタID、既に登録されているならそのカウンタID [ -1ならカウンタパスに間違いがあった]
#define global ctype AddPerformanceCounter(%1,%2,%3="",%4="") _AddPerformanceCounter( %1,%2,%3,%4,2)
#defcfunc _AddPerformanceCounter int id,str Object,str Instance,str Counter,int cmode
_cid=SetCounterID(Object,Instance, Counter)
mref _refstr,65
if length(hPerformanceCounter)<=_cid {hPerformanceCounter(_cid)=0}
if hPerformanceCounter(_cid) {hCounter=hPerformanceCounter(_cid):_refstr=path:return _cid}
if length(hQuery)<=id {hQuery(id)=0}
if hQuery(id)=0 {
PdhOpenQuery 0, 0, hQuery(id)
if stat {dialog "AddPerformanceCounter\nPdhOpenQuery\nerr"+strf(" 0x%08x",stat):end}
}
hPerformanceCounter_ID(_cid)=id
PdhAddCounter hQuery(id),PathList(_cid),0, varptr(hPerformanceCounter(_cid))
if stat {hCounter=0
if stat=0xc0000bc0 /*PDH_CSTATUS_BAD_COUNTERNAME*/ {_refstr=path
return -1
}
dialog PathList(_cid)+"\nPdhAddCounter\nerr"+strf(" 0x%08x",stat):end
}
if hPerformanceCounter(_cid) {hCounter=hPerformanceCounter(_cid)}
strf_fmt(_cid)=_GetStrfFMT(_cid,"",1)
pdh_fmt(_cid)=0x00000200 | 0x00008000 //PDH_FMT_DOUBLE|PDH_FMT_NOCAP100
ins_total(_cid)=0
pc_div(_cid)=1.0
_refstr=path
ALL_CounterMode(_cid)=cmode
PdhCollectQueryData hQuery(id)
if stat {
if stat=0x800007D5 /*PDH_NO_DATA*/{return _cid}
dialog "AddPerformanceCounter\nPdhCollectQueryData\nerr"+strf(" 0x%08x",stat):end
}
_Size=0
_Count=0
PdhGetFormattedCounterArray hPerformanceCounter(_cid),0x00000100 ,varptr(_Size),varptr(_Count),0
if stat ! 0{
if (stat ! 0x800007d2) {dialog PathList(_cid)+"\nPdhGetFormattedCounterArray\nerr"+strf(" 0x%08x",stat):end}
}
return _cid
//---------カウンタ値取得時の形式を指定--------
//[SetPCFMT cid, strffmt, instotal, pcdiv, pdhfmt]
// cid =カウンタIDを指定(省略不可)
// strffmt =文字列でカウンタ値を受け取るときの書式指定(省略時カウンタタイプにあわせた形式)[strf()の書式指定文字列と同じ、%を付けない時は "5.1" の様に文字数だけを指定できる]
// instotal =カウンタデータ取得時に_Totalを含めるかどうか(省略時0)[0=含める 1=除外]※ProcessやThreadの場合_Totalと同じ名前のファイルが実行されてると、そっちが除外される可能性あり
// pcdiv =カウンタ値を割る数値(省略時1.0)[0.0は1.0として処理、割り算なので0.1は10倍になる]※AddCPUPerformanceCounterで追加した%付きは1.0固定、AddProcessPerformanceCounterで追加した%付きはコア数で固定
// pdhfmt =スケールフラグ(省略時0)[0=100%以上を許します(PDH_FMT_NOCAP100) 1=計算で既定のスケールを使いません(PDH_FMT_NOSCALE) 2=実際の値に1000を掛けます(PDH_FMT_1000) 3=100%を上限にします]
#define global SetPCFMT(%1,%2="",%3=0,%4=1.0,%5=0) _SetPCFMT %1,%2,%3,%4,%5
#deffunc _SetPCFMT int cid,str strffmt,int instotal,double pcdiv,int pdhfmt
ins_total(cid)=limit(instotal,0,1)
if strffmt="" {strf_fmt(cid)=_GetStrfFMT(cid,"",1)}else{
_strffmt=strffmt
if instr(_strffmt,0,"%")>=0 {
strf_fmt(cid)=strffmt
}else{
if pcdiv=0.0 or pcdiv=1.0 {strf_fmt(cid)=_GetStrfFMT(cid,strffmt,1)}else{strf_fmt(cid)=_GetStrfFMT(cid,strffmt,0)}
}
}
if pcdiv=0.0 or pcdiv=1.0{pc_div(cid)=1.0}else{pc_div(cid)=pcdiv}
if pdhfmt=0 or pdhfmt=0x00008000 /*PDH_FMT_NOCAP100*/ {
pdh_fmt(cid)=0x00000200 | 0x00008000 /*PDH_FMT_DOUBLE|PDH_FMT_NOCAP100*/
}else{
if pdhfmt=3 {pdh_fmt(cid)=0x00008000 /*PDH_FMT_DOUBLE*/}else{
if pdhfmt<3 {
pdh_fmt(cid)=0x00000200 | (pdhfmt=1)*0x00001000 | (pdhfmt=2)*0x00008000 //PDH_FMT_DOUBLE|(pdhfmt=1)*PDH_FMT_NOSCALE|(pdhfmt=2)*PDH_FMT_1000
}else{
pdh_fmt(cid)=0x00000200 | pdhfmt //PDH_FMT_DOUBLE|pdhfmt
}
}
}
return
//---------利用可能なオブジェクトのリストを取得--------
//[GetObjectList mszObjectList, cr]
// mszObjectList =オブジェクトのリストを取得する文字列型変数(省略時はキャッシュ更新だけする)
// cr =リスト取得の形式(省略時0)[0=配列 1=改行(最後は改行なし) 2=改行(最後も改行する)]
//atatにオブジェクト数が返る(mszObjectListを省略時はエラーコードが返ります)/*PERF_DETAIL_WIZARD*/
#define global GetObjectList(%1=temp@mod_PdhPC,%2=0) if varptr(%1) ! varptr(temp@mod_PdhPC) {_GetObjectList %1,%2,%1}//else{%1=0:PdhEnumObjects 0,0,0,varptr(%1) ,400 ,1}
#deffunc _GetObjectList var mszObjectList,int cr,array array_mszObjectList
ObjectMax=0
pcchBufferLength=0
mszObjectList=""
repeat 2
memexpand mszObjectList,pcchBufferLength+1
PdhEnumObjects 0,0,varptr(mszObjectList),varptr(pcchBufferLength) ,400 /*PERF_DETAIL_WIZARD*/,cnt=0
loop
if stat {dialog "カウンタの取得に失敗しました\nerr"+strf(" 0x%08x",stat):end}
index=0
repeat
index=strlen(mszObjectList)
if (index+2)>=pcchBufferLength {break}
poke mszObjectList,index,'_'
ObjectMax++
loop
if cr=0{
split mszObjectList,"_",array_mszObjectList
}else{
strrep mszObjectList,"_","\n"
if cr=2 {mszObjectList+"\n"}
}
return ObjectMax
//---------オブジェクト名を指定してカウンタリストを取得--------
//[GetInstanceCounterList szInstanceList, InstanceMax, szCounterList, CounterMax, szObjectName, cr]
// szInstanceList =インスタンスリストを取得する文字列型変数
// InstanceMax =インスタンス数が返る変数
// szCounterList =カウンタリストを取得する文字列型変数
// CounterMax =カウンタ数が返る変数
// szObjectName =オブジェクト名(省略不可)["Processor" "Process" "Thread" "Memory" "Paging File" "PhysicalDisk" など、他にもあるが詳しくは知らない]
// cr =リスト取得の形式(省略時0)[0=配列 1=改行(最後は改行なし) 2=改行(最後も改行する)]
//statが0なら取得成功、それ以外は失敗(PdhEnumObjectItemsのエラーコード)
#define global GetInstanceCounterList(%1,%2,%3,%4,%5,%6=0) _GetInstanceCounterList %1,%2,%3,%4,%5,%6,%1,%3
#deffunc _GetInstanceCounterList var szInstanceList,var InstanceMax,var szCounterList,var CounterMax,str szObjectName,int cr,array array_szInstanceList,array array_szCounterList
dwCounterSize=dwCounterSize_max
dwInstanceSize=dwInstanceSize_max
szInstanceList=""
szCounterList=""
InstanceMax=0
CounterMax=0
repeat 2
memexpand szCounterList,dwCounterSize+1
memexpand szInstanceList,dwInstanceSize+1
PdhEnumObjectItems 0,0,szObjectName,varptr(szCounterList) ,varptr(dwCounterSize),varptr(szInstanceList),varptr(dwInstanceSize),400 /*PERF_DETAIL_WIZARD*/,0
if stat=0 {break}
loop
if stat {return stat}
if dwCounterSize>dwCounterSize_max {dwCounterSize_max=dwCounterSize}
if dwInstanceSize>dwInstanceSize_max {dwInstanceSize_max=dwInstanceSize}
if dwCounterSize {
index=0
repeat
index=strlen(szCounterList)
if (index+2)>=dwCounterSize {break}
poke szCounterList,index,'_'
CounterMax++
loop
if cr=0{
split szCounterList,"_",array_szCounterList
}else{
strrep szCounterList,"_","\n"
if cr=2 {szCounterList+"\n"}
}
}
if dwInstanceSize {
index=0
repeat
InstanceMax++
index=strlen(szInstanceList)
if (index+2)>=dwInstanceSize {break}
poke szInstanceList,index,'|'
loop
if cr=0{
split szInstanceList,"|",array_szInstanceList
}else{
strrep szInstanceList,"|","\n"
if cr=2 {szInstanceList+"\n"}
}
}
return 0
//--------ワイルドカードを使用したパスを展開して取得------
//[GetWildCardPath mszExpandedPathList, szWildCardPath, OCdel]
// mszExpandedPathList =ワイルドカードを展開したカウンタパスを取得する文字列型変数
// szWildCardPath =ワイルドカードを使ったカウンタパスを指定["\\Process(*/*)\\% Processor Time"と指定すると*のインスタンスが展開される]
// cr =リスト取得の形式(省略時0)[0=配列 1=改行(最後は改行なし) 2=改行(最後も改行する)]
// OCdel =展開されたパスから()内のみを出力(省略時0)[0=フルパス 1=Instanceのみ]
//statに展開された個数が返る(_Total含む)
//取得したパスにはコンピュータ名も含まれるが一行取り出せばAddPerformanceCounterのObjectにそのまま使える
#define global GetWildCardPath(%1,%2,%3=0,%4=0) _GetWildCardPath %1,%2,%3,%4,%1
#deffunc _GetWildCardPath var mszExpandedPathList,str szWildCardPath,int cr,int OCdel,array array_mszExpandedPathList
mszExpandedPathList=""
_szWildCardPath=szWildCardPath
strrep _szWildCardPath,"(*)","(*/*)"
indexc=instr(_szWildCardPath,0,")\\")
if (indexc+2)=strlen(_szWildCardPath) {_szWildCardPath+"temp"}
repeat 2
memexpand mszExpandedPathList,pcchPathListLength+1
PdhExpandWildCardPath 0,_szWildCardPath,varptr(mszExpandedPathList),varptr(pcchPathListLength),0
if stat=0 {break}
loop
index=0
PathMax=0
if pcchPathListLength=0 {return 0}else{memexpand mszExpandedPathList,pcchPathListLength+1:poke mszExpandedPathList,pcchPathListLength,0}
pdwBufferSize=1024
dim pCounterPathElements,pdwBufferSize/4+1
PdhParseCounterPath mszExpandedPathList,varptr(pCounterPathElements),varptr(pdwBufferSize),0//カウンタパスを分解
dupptr dup_tempstr,pCounterPathElements(0),1,2
objp=dup_tempstr+"\\"
dupptr dup_tempstr,pCounterPathElements(1),1,2
objp+dup_tempstr+"("
dupptr dup_tempstr,pCounterPathElements(5),1,2
cntp=")\\"+dup_tempstr
repeat
index=strlen(mszExpandedPathList)
if (index+2)>=pcchPathListLength {
mszExpandedPathList+"|"
PathMax=cnt+1:break
}
poke mszExpandedPathList,index,'|'
loop
if OCdel{
strrep mszExpandedPathList,objp,""
strrep mszExpandedPathList,cntp+"|","\n"
if cr=2 {poke mszExpandedPathList,strlen(mszExpandedPathList)-2,0}
if cr=0 {split mszExpandedPathList,"\n",array_mszExpandedPathList }
}else{
if cr<2 {poke mszExpandedPathList,pcchPathListLength-1,0}
if cr {
strrep mszExpandedPathList,"|","\n"
}else{
poke mszExpandedPathList,pcchPathListLength-1,0
split mszExpandedPathList,"|",array_mszExpandedPathList
}
}
return PathMax
//-------CPUコア数を取得--------
//[変数 = TotalCPUCore]
#define global TotalCPUCore _TotalCPUCore()
#defcfunc _TotalCPUCore
if Totalcore=0 {
GetWildCardPath temp_list,"\\Processor(*/*)\\% Processor Time",1
if stat=0 {dialog "CPUの数が取得できませんでした"}
Totalcore=stat
if instr(temp_list,0,"\\Processor(_Total)\\% Processor Time")>=0 {Totalcore-1}
}
return Totalcore
//-------カウンタ値を受け取る--------
//[GetProcessPerformanceCounter cdata, cid, strf_fmt, cr, byt]
// cdata =カウンタ値を受け取る配列[str=文字列型で取得 int=整数型で取得 double=実数型で取得] ※int型は$7fffffffを超えると負数になってしまうのでbytで単位を変えて取得するかdoubleを使うと良い
// cid =使用してるカウンタのタイプを指定(省略時0)[0〜13 VIRTUAL_BYTES_PEAK等のマクロで指定可能]
// cr =cdataの変数が文字列型の場合に改行するか配列で受け取るかの指定(省略時0)[0=配列 1=改行(最後は改行なし) 2=改行(最後も改行する)]
//statに受け取ったカウンタ値の個数が返る[0=終了か新しく実行したしたプロセスが有る -1=カウンタIDが未使用か削除された それ以外の負数はPdhGetFormattedCounterArrayのエラーコード] ※0以下の場合cdataは上書きされずにそのまま返される
//refstrにカウンタ名が返る
#define global GetPerformanceCounter(%1,%2=0,%3=0) _GetPerformanceCounter %1,%2,%3,%1
#deffunc _GetPerformanceCounter var cdata,int cid,int cr,array array_cdata
Size=0
Count=0
mref _refstr,65
_refstr=""
if cid<0 or cid>=CounterID_MAX {return -1}
hCounter=hPerformanceCounter(cid)
split PathList(cid),"\\",str_Counter
str_Counter=str_Counter(limit(stat-1,0,stat))
if hCounter=0 {return -1}
type=vartype(cdata)
Size=ProcessCounterSize
InstanceBuffer=""
pdhfmt=pdh_fmt(cid)
repeat 2
memexpand InstanceBuffer,Size+1
PdhGetFormattedCounterArray hCounter,pdhfmt,varptr(Size),varptr(Count),varptr(InstanceBuffer)
if stat=0 {break}
loop
if Size>ProcessCounterSize {ProcessCounterSize=Size}
if stat {_refstr=str_Counter:if stat=-1073738822 or stat=0x800007D5 /*PDH_NO_DATA*/ { return 0 }else{return stat}}
if Count=0 {_refstr=str_Counter: return 0 }
dupptr dup_db,varptr(InstanceBuffer),lpeek(InstanceBuffer,0)-varptr(InstanceBuffer),3
fp=strf_fmt(cid)
if fp="" {fp="%d"}
if ins_total(cid)=1 {//"_Total"があればCount-1
_Total_test=GetInstanceName(Count-1)
_Total_test_len=strlen(_Total_test)
if _Total_test_len=6 {
if instr(_Total_test,0,"_Total")=0 {Count-1}
}else{
if _Total_test_len=13 {
if instr(_Total_test,0,"_Total/_Total")=0 {Count-1}
}
}
}
_refstr=str_Counter
if ALL_CounterMode(cid)=2{//AddPerformanceCounterで追加したカウンタ
div=pc_div(cid)
}else{
if ALL_CounterMode(cid)=0 {//AddCPUPerformanceCounterで追加したカウンタ
if peek(str_Counter,0) = '%' {div=1.0}else{div=pc_div(cid)}
}else{//AddProcessPerformanceCounterで追加したカウンタ
if peek(str_Counter,0) = '%' {div=double(TotalCPUCore)}else{div=pc_div(cid)}
}
}
if Count>0 {
if type=2 {
if cr {
cdata=""
repeat Count-1
cdata+strf(fp,dup_db(cnt*3+2)/div)+"\n"
loop
cdata+strf(fp,dup_db((Count-1)*3+2)/div)
if cr=2 {cdata+"\n"}
}else{
array_cdata(Count-1)=""
repeat Count
array_cdata(cnt)=strf(fp,dup_db(cnt*3+2)/div)
loop
}
}else{
if type=4 {array_cdata(Count-1)=0:int_double=0}else{array_cdata(Count-1)=0.0:int_double=0.0}
repeat Count
array_cdata(cnt)=int_double+dup_db(cnt*3+2)/div
loop
}
}
return Count
//-------カウンタ更新--------
//[CollectQueryData id]
// id =クエリーID
//statが0なら成功、-1なら使用されてないクエリーIDが指定された
#deffunc CollectQueryData int id
if length(hQuery)<=id {
return -1
}else{
if hQuery(id)=0 {return -1}else{
PdhCollectQueryData hQuery(id)
if stat=0xC0000BBC /*PDH_INVALID_HANDLE*/ {dialog "PdhCollectQueryData\nerr"+strf(" 0x%08x",stat):end}
}
}
return stat
//-----カウンタ値を受け取った後に個別にカウンタ値を実数型で取得(文字列型で取得していて数値でも必要な時用)------
//[変数 = GetCounterData( ino )]
// ino =取得するカウンタ値の順番(0〜)を指定
//必ずGetPerformanceCounterの後に実行してください
#defcfunc GetCounterData int ino
if Count>ino {
return dup_db(ino*3+2)/div
}
return 0.0
//-----カウンタ値を受け取った後にインスタンス名を一つ取得する関数------
//[変数 = GetInstanceName( ino )]
// ino =取得するインスタンスの順番(0〜)を指定
//必ずGetPerformanceCounterの後に実行してください
#defcfunc GetInstanceName int ino
if Count>ino {
dupptr dup_insname,lpeek(InstanceBuffer,ino*24),1,2
}else{
return ""
}
return dup_insname
//-----カウンタ値を受け取った後にインスタンス名を全て取得する------
//[GetInstanceNameList InstanceList, cr]
// InstanceList =インスタンス名を受け取る文字列型変数
// cr =各インスタンス名で改行するか配列で受け取るかの指定(省略時0)[0=配列 1=改行(最後は改行なし) 2=改行(最後も改行する)]
//statに受け取ったインスタンス名の個数が返る[0の場合は終了か新しく実行したしたプロセスがあった、この場合InstanceListは上書きされずにそのまま返される]
//必ずGetPerformanceCounterの後に実行してください
#define global GetInstanceNameList(%1,%2) _GetInstanceNameList %1,%2,%1
#deffunc _GetInstanceNameList var InstanceList,int cr,array array_InstanceList
if Count>0 {
pInstanceBuffer=varptr(InstanceBuffer)
InstanceList=""
memexpand InstanceList,Size+1
memcpy InstanceList,InstanceBuffer,Size-(lpeek(InstanceBuffer,0)-pInstanceBuffer),0,(lpeek(InstanceBuffer,0)-pInstanceBuffer)
pInstanceBuffer_i0=lpeek(InstanceBuffer,0)
repeat Count-1,1
poke InstanceList,lpeek(InstanceBuffer,cnt*24)-pInstanceBuffer_i0-1,'|'
loop
if cr=0{
split InstanceList,"|",array_InstanceList
}else{
strrep InstanceList,"|","\n"
if cr=2 {InstanceList+"\n"}
}
}
return Count
//-----クエリーをID別に終了------
//[CloseQuery id]
// id =終了するクエリーID
//同じクエリーIDに登録されてるカウンタも終了します
//statが0なら成功、-1ならIDが未使用だった、これら以外はPdhCloseQueryのエラーコード
#deffunc CloseQuery int id
if length(hQuery)>id {
if hQuery(id) {//現在オープンされてるQueryを閉じる
PdhCloseQuery hQuery(id)
hQuery(id)=0
repeat length(hPerformanceCounter_ID)
if hPerformanceCounter_ID(cnt)=id and hPerformanceCounter(cnt)!0 {
if _hCounter_bak=hPerformanceCounter(cnt) {_hCounter_bak=0}
hPerformanceCounter(cnt)=0
}
loop
if stat {dialog "PdhCloseQuery\nerr"+strf(" 0x%08x",stat)}
return 0
}
}
return -1
//-----パフォーマンス カウンタ全て終了------
//[PdhCloseQuery_ALL]
//終了時に呼び出されるので特に使用する必要は無い
#deffunc CloseQuery_ALL onexit
_hCounter_bak=0
repeat length(hQuery)
if hQuery(cnt) {//現在オープンされてるQueryを閉じる
PdhCloseQuery hQuery(cnt)
hQuery(cnt)=0
if stat {dialog "PdhCloseQuery\nerr"+strf(" 0x%08x",stat)}
}
loop
repeat length(hPerformanceCounter)
hPerformanceCounter(cnt)=0
loop
return
//-----カウンタIDを指定して削除------
//[DelPerformanceCounter cid]
// cid =削除するカウンタID(省略時0)
//statが0なら成功、-1ならIDが未使用だった、これら以外はPdhRemoveCounterのエラーコード
#deffunc DelPerformanceCounter int cid
if length(hPerformanceCounter)<=cid or cid<0{return -1}
if hPerformanceCounter(cid)=_hCounter_bak{_hCounter_bak=0}
if hPerformanceCounter(cid) {PdhRemoveCounter hPerformanceCounter(cid):hPerformanceCounter(cid)=0}else{return -1}
return
//-------_Totalを含めるかどうかの設定--------
//[SetTotalSwitch tswt]
// tswt =カウンタデータ取得時に_Totalを含めるかどうか(省略時0)[0=_Total値が0の場合除外 1=全て除外 2=全て含める]
//statに変更前の設定が返る
//カウンタ値取得前に設定すればカウンタ別に設定が出来る
//GetCPUPerformanceCounterは常に_Totalの結果も返す
#deffunc SetTotalSwitch int tswt
bak_tswt=_tswt
_tswt=limit(tswt,0,2)
return bak_tswt
//-------クエリーのハンドルを取得--------
//[変数 = GetQueryHandle(id)]
// id =クエリーハンドルを取得するクエリーID
//結果が0ならクエリーIDは使われてない
#defcfunc GetQueryHandle int id
if length(hQuery)<=id or id<0{return 0}
return hQuery(id)
//---------稼働してるカウンタのハンドルを取得----
//[変数 = GetCounterHandle( cid )]
// cid =カウンタIDを指定(省略時-1) [省略されるか-1の場合直前にカウンタ値取得かカウンタ追加したカウンタのハンドルを取得する]
//0が取得された場合はカウンタが稼働していなかった
#define global ctype GetCounterHandle(%1=-1) _GetCounterHandle(%1)
#defcfunc _GetCounterHandle int cid
if cid<0 {
return hCounter
}
return hPerformanceCounter(cid)
//---------稼働してるカウンタの情報を取得----
//[変数 = GetCounterInfo( cid, Info)]
// cid =カウンタIDを指定(省略時-1) [省略すると直前にカウンタ値取得かカウンタ追加したカウンタIDが使われる]
// Info =カウンタ情報のインデックス(省略時0)[0=データタイプ 1=バージョン 2=状態 3=現在のスケールファクタ 4=デフォルトのスケールファクタ 5=UserData 6=QueryUserData 7=パス 8=マシン名 9=オブジェクト名 10=インスタンス名 11=親インスタンス 12=インデックス 13=カウンタ名 14=説明]
//詳しくは下のURLを参照(dwLengthを除外した情報を取得します)
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa373038(v=vs.85).aspx
#define global ctype GetCounterInfo(%1=-1,%2=0) _GetCounterInfo(%1,%2)
#defcfunc _GetCounterInfo int cid,int Info
if length(inft)=1 {
inft=0,0,0,0,0,0,0,1, 1,1,1,1,0,1 ,1
inf_index=4,8,12,16,20,24,28,32,36,40,44,48,52,56,64
}
_hCounter=_GetCounterHandle(cid)
if _hCounter=0 {return ""}
if (_hCounter_bak ! _hCounter) or BSize=0 {
BSize=3000
repeat 2
sdim lpBuffer,BSize+1
PdhGetCounterInfo _hCounter,1,varptr(BSize),varptr(lpBuffer)
if stat=0 {break}
loop
if BSize=0 {return ""}
_hCounter_bak=_hCounter
}
if inft(Info)=0 {return str(lpeek(lpBuffer,inf_index(Info)))}
if lpeek(lpBuffer,inf_index(Info))=0 {return ""}
dupptr dup_str,lpeek(lpBuffer,inf_index(Info)),pdwBufferSize-(varptr(lpBuffer)-lpeek(lpBuffer,inf_index(Info))),2
return dup_str
//---------稼働してるカウンタの情報を取得----
//[GetCounterAllInfo CounterInfo, cid, cr]
// CounterInfo =カウンタの情報を取得する文字列型変数
// cid =カウンタIDを指定(省略時-1) [省略すると直前にカウンタ値取得かカウンタ追加したカウンタIDが使われる]
// cr =各インスタンス名で改行するか配列で受け取るかの指定(省略時0)[0=配列 1=改行(最後は改行なし) 2=改行(最後も改行する)]
//詳しくは下のURLを参照(dwLengthを除外した情報を取得します)
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa373038(v=vs.85).aspx
#define global GetCounterAllInfo(%1,%2=0,%3=1) _GetCounterAllInfo %1,%2,%3,%1
#deffunc _GetCounterAllInfo var CounterInfo,int cid,int cr,array array_CounterInfo
CounterInfo=""
if length(inft)=1 {
inft=0,0,0,0,0,0,0,1, 1,1,1,1,0,1 ,1
inf_index=4,8,12,16,20,24,28,32,36,40,44,48,52,56,64
}
_hCounter=_GetCounterHandle(cid)
BSize=3000
repeat 2
sdim lpBuffer,BSize+1
PdhGetCounterInfo _hCounter,1,varptr(BSize),varptr(lpBuffer)
if stat=0 {break}
loop
if BSize=0 {return }
if cr{
repeat 14
if inft(cnt)=0 {
if cnt<=2 {
CounterInfo+strf("$%X\n",lpeek(lpBuffer,inf_index(cnt)))
}else{
CounterInfo+strf("%d\n",lpeek(lpBuffer,inf_index(cnt)))
}
continue
}
if lpeek(lpBuffer,inf_index(cnt))=0 {CounterInfo+"\n":continue}
dupptr dup_str,lpeek(lpBuffer,inf_index(cnt)),pdwBufferSize-(varptr(lpBuffer)-lpeek(lpBuffer,inf_index(cnt))),2
CounterInfo+dup_str+"\n"
loop
dupptr dup_str,lpeek(lpBuffer,inf_index(14)),pdwBufferSize-(varptr(lpBuffer)-lpeek(lpBuffer,inf_index(14))),2
CounterInfo+dup_str
if cr=2{CounterInfo+"\n"}
}else{
repeat 15
if inft(cnt)=0 {
if cnt<=2 {
array_CounterInfo(cnt)=strf("$%X",lpeek(lpBuffer,inf_index(cnt)))
}else{
array_CounterInfo(cnt)=strf("%d",lpeek(lpBuffer,inf_index(cnt)))
}
continue
}
if lpeek(lpBuffer,inf_index(cnt))=0 {array_CounterInfo(cnt)="":continue}
dupptr dup_str,lpeek(lpBuffer,inf_index(cnt)),pdwBufferSize-(varptr(lpBuffer)-lpeek(lpBuffer,inf_index(cnt))),2
array_CounterInfo(cnt)=dup_str
loop
}
return
#deffunc StrfFormatType
sdim Strf_Format_Type,,8,4
Strf_Format_Type(0,0)="$%X","%d","%f","%f"
Strf_Format_Type(0,1)="%d","%f","%f","%f","%d","%f","%f","%f"
Strf_Format_Type(0,2)="%s","%s"
Strf_Format_Type(0,3)="%d"
display_typ="", "/sec","%%","secs","","Byte","KB","MB","MHz","%%","mW"
return
#deffunc SetStrfFMTDisp int cf_typ,int cf_index,str fmtdisp
if vartype(Strf_Format_Type)=4 {StrfFormatType}
if cf_typ<4 {
_fmtdisp=Strf_Format_Type(cf_index,cf_typ)
Strf_Format_Type(cf_index,cf_typ)=fmtdisp
}else{
_fmtdisp=display_typ(cf_index)
display_typ(cf_index)=fmtdisp
}
return _fmtdisp
//---------カウンタタイプに応じた書式指定文字列を取得と----[strf()の書式指定文字列と同じ]
//[変数 = GetStrfFMTDisp( cid, Disp, Str_Len)]
// cid =カウンタIDを指定(省略時-1) [省略すると直前にカウンタ値取得かカウンタ追加したカウンタIDが使われる]
// Disp =カウンタタイプに応じて % や /sec を追加すかの指定(省略時1)[0=追加しない 1=追加する]
// Str_Len =文字数指定 (省略時は既定の文字数)[strf"%6.2f",A) の 6.2 だけを文字列で指定する感じ]
#define global ctype GetCounterDisp(%1=-1) _GetCounterDisp(%1)
#defcfunc _GetCounterDisp int cid
if vartype(display_typ)=4 {StrfFormatType}
dwType=int(GetCounterInfo(cid))
if dwType=0 {
//カウンタオブジェクトがProcessorPerformanceの時Type値が設定されてないようなので別処理
if "ProcessorPerformance"=GetCounterInfo(cid,9) {
cstr=GetCounterInfo(cid,13)
;if Str_Len=""{_StrfFMT="%.1"}else{_StrfFMT="%"+Str_Len}
if instr(cstr,0,"プロセッサ")>=0 {dwType = $80000000}else{
if instr(cstr,0,"%")>=0 {dwType = $90000000}else{dwType = $A0000000}
}
;return _StrfFMT+"f "+display_typ(10)
}
}
cdt=(peek(dwType,3)&$f0)/$10
if display_typ(cdt)="" {
cstr=GetCounterInfo(cid,13)
cstr_index=instr(cstr,0,"Bytes")
if cstr_index>=0{
if cstr_index=0 {
return display_typ(5)
}
if peek(cstr,cstr_index-1)=' ' {return display_typ(5)}else{
if peek(cstr,cstr_index-1)='K' {return display_typ(6)}
if peek(cstr,cstr_index-1)='M' {return display_typ(7)}
}
return strmid(cstr,cstr_index-km,6+km)
}else{
if instr(cstr,0,"Megabytes")=0 {return display_typ(7)}
if instr(cstr,0,"Working")>=0 {return display_typ(5)}
}
}
return display_typ(cdt)
//---------カウンタタイプに応じた書式指定文字列を取得----[strf()の書式指定文字列と同じ]
//[変数 = GetStrfFMT( cid, Str_Len)]
// cid =カウンタIDを指定(省略時-1) [省略すると最後にカウンタ値取得かカウンタ追加したカウンタIDが使われる]
// Str_Len =文字数指定 (省略時は既定の文字数)[strf"%6.2f",A) の 6.2 だけを文字列で指定する感じ]
// Disp =カウンタタイプに元から指定されてる % や /sec を追加すかの指定(省略時1)[0=追加しない 1=追加する]
#define global ctype GetStrfFMT(%1=-1,%2="",%3=1) _GetStrfFMT(%1,%2,%3)
#defcfunc _GetStrfFMT int cid,str Str_Len,int Disp
if vartype(Strf_Format_Type)=4 {StrfFormatType}
_Disp=Disp
dwType=int(GetCounterInfo(cid))
if dwType=0 {
//カウンタオブジェクトがProcessorPerformanceの時Type値が設定されてないようなので別処理
if "ProcessorPerformance"=GetCounterInfo(cid,9) {
dwType=$30000
if Disp {
cstr=GetCounterInfo(cid,13)
if instr(cstr,0,"プロセッサ")>=0 {dwType | $80000000}else{
if instr(cstr,0,"%")>=0 {dwType | $90000000}else{dwType | $A0000000}
}
}
}
}
ct=(peek(dwType,1)&$c)/$4
cf=(peek(dwType,2)&$f)/$1
cdt=(peek(dwType,3)&$f0)/$10
if Str_Len="" {
_StrfFMT=Strf_Format_Type(cf,ct)
}else{
_Str_Len=Str_Len
if instr(_Str_Len,0,"%") >=0 {
_Disp=0
_StrfFMT=Str_Len
}else{
_StrfFMT=Strf_Format_Type(cf,ct)
cstr_index=instr(_StrfFMT,0,"%")
_StrfFMT=strmid(_StrfFMT,0,cstr_index+1) + strmid(_StrfFMT,-1,1)
strrep _StrfFMT,"%","%"+Str_Len
}
}
if _Disp {
if display_typ(cdt)="" {
cstr=GetCounterInfo(cid,13)
cstr_index=instr(cstr,0,"Bytes")
if cstr_index>=0 {
if cstr_index=0 {
return _StrfFMT+" "+display_typ(5)
}
if peek(cstr,cstr_index-1)=' ' {_StrfFMT+" "+display_typ(5)}else{
if peek(cstr,cstr_index-1)='K' {_StrfFMT+" "+display_typ(6)}
if peek(cstr,cstr_index-1)='M' {_StrfFMT+" "+display_typ(7)}
}
}else{
if instr(cstr,0,"Megabytes")>=0 {_StrfFMT+" "+display_typ(7)}else{
if instr(cstr,0,"Working")>=0 {_StrfFMT+" "+display_typ(5)}}
}
}else{return _StrfFMT+" "+display_typ(cdt)}
}
return _StrfFMT
#global
これをmod_PdhPC.hspで保存
サンプル
#include "mod_PdhPC.hsp"
//-------オブジェクト、インスタンス、カウンタを指定してパフォーマンスカウンタをクエリーに追加--------
//[cid=AddPerformanceCounter id, Object, Instance, Counter]
cid=AddPerformanceCounter( 0, "LogicalDisk","*/*","% Disk Time")
if stat<0 {dialog "カウンタが設定できなかった":end}
//---------カウンタ値取得時の形式を指定--------
//[SetPCFMT cid, 6文字で小数点以下2文字, (省略_total含む), (省略1.0で割る), 上限100]
SetPCFMT cid,"6.2",,,3
screen 0,300,200
gsel 0,2
Set_Wait=100
cdata=""
repeat
redraw 0
color 255,255,255
boxf
color
//-------カウンタ更新--------
//[CollectQueryData クエリーID0指定]
CollectQueryData 0
if stat<0 {dialog "カウンタの更新に失敗":end}
//-----AddPerformanceCounterで追加したパフォーマンスカウンタを受け取る------
//[GetPerformanceCounter 受け取る変数に文字列型を使用, 追加したカウンターIDを指定, 配列指定]
GetPerformanceCounter cdata, cid,0
i=stat
if i>0 {
pos 0,0
repeat i
mes ""+GetInstanceName(cnt)+" ["+cdata(cnt)+"]"
loop
}
redraw 1
wait Set_Wait
loop
"% Disk Time"の解説は
選択したディスク ドライブが読み取りまたは書き込み要求を処理していてビジー状態にあった経過時間の割合をパーセントで表示します。
| |
|
2014/11/21(Fri) 23:05:50|NO.66128
後、下のを実行すると各カウンタが持ってる解説が読めます
#module "mod_comboxex"
#uselib "user32"
#func SetWindowPos "SetWindowPos" int, int, int, int, int, int, int
//cb_strに追加する項目、cb_iに指定インデックス(省略か-1で最後を指定)、追加モード(省略時0)[0=追加 1=上書き]
#define global combadd(%1,%2=-1,%3=0) _combadd %1,%2,%3
#deffunc _combadd str cb_str,int cb_i,int add
if add=0 {
if cb_i<0 {
sendmsg _combh,$0143,0,cb_str //CB_ADDSTRING = $0143; // リストボックスへの文字列の追加
}else{
sendmsg _combh,$014A,cb_i,cb_str //CB_INSERTSTRING = $014A; // リストボックスへの文字列の挿入
}
}else{
if cb_i<0 {
sendmsg _combh,$0146,0,0 // CB_GETCOUNT= $0146;リストボックスの項目数の取得
sendmsg _combh,$0144,limit(stat-1,0,stat),0 //CB_DELETESTRING= $0144; // リストボックスの文字列の削除
sendmsg _combh,$0143,0,cb_str
}else{
sendmsg _combh,$0144,cb_i,0
sendmsg _combh,$014A,cb_i,cb_str
}
}
return stat
//cb_strに更新する入力項目リスト
#deffunc combset str cb_str
_cb_str=cb_str
sendmsg _combh,$014B,0,0 //CB_RESETCONTENT = $014B; // リストボックスとエディットの全内容をクリア
split _cb_str,"\n",comblist
repeat stat
sendmsg _combh,$0143,0,comblist(cnt) //CB_ADDSTRING = $0143; // リストボックスへの文字列の追加
loop
return stat
//cb_iに削除するインデックス
#deffunc combdel int cb_i
if cb_i<0 {sendmsg _combh,$0146,0,0 // CB_GETCOUNT= $0146;リストボックスの項目数の取得
_cb_i=limit(stat-1,0,stat)}else{_cb_i=cb_i}
sendmsg _combh,$0144,_cb_i,0 //CB_DELETESTRING= $0144; // リストボックスの文字列の削除
return stat
//cb_strに入力項目リスト、syにリストサイズ(cb_stに$400を指定した時やcb_stに1を指定した時)、cb_stにcomboxのスタイル($50200200に追加する形)省略時は$54210242
//statにオブジェクトIDが返る
#deffunc comboxex str cb_str ,int sy,int cb_st
mref BMSCR, 67
if BMSCR(48)=2 {fsize=BMSCR(32)}else{
if BMSCR(48) {fsize=12}else{fsize=18}
}
if cb_st=0 {_cb_st=$54210242 }else{_cb_st=$50200200 | cb_st | 3*((cb_st&3)=0)}
winobj "ComboBox","",0,_cb_st,BMSCR(29),fsize,hwnd,0
_cb_id=stat
_combh=objinfo(_cb_id,2)
pos ginfo_cx,ginfo_cy+BMSCR(31)
gsel_id=ginfo_sel
if BMSCR(48)=2 {
fsty=(BMSCR(53)>400) | peek(BMSCR(54),0)*2 | peek(BMSCR(54),1)*4 | peek(BMSCR(54),2)*8 | (peek(BMSCR(54),6)=4)*16
dupptr lfFaceName,varptr(BMSCR(56)),1,2
fname=lfFaceName
buffer 256+_cb_id,1,1
font fname, fsize, fsty
mref BMSCR_buf, 67
sendmsg _combh, $30,BMSCR_buf(38)
}else{
buffer 256+_cb_id,1,1
if BMSCR(48)=0 {sysfont 0}else{sysfont 17}
mref BMSCR_buf, 67
sendmsg _combh, $30,BMSCR_buf(38)
}
gsel gsel_id
_cb_str=cb_str
split _cb_str,"\n",comb_list
repeat stat
sendmsg _combh,$0143,0,comb_list(cnt) //CB_ADDSTRING = $0143; // リストボックスへの文字列の追加
loop
sendmsg _combh,$0154,0,0 //CB_GETITEMHEIGHT = $0154; // 項目の高さの取得
sizey=stat
if sy>0 {_sy=limit(sy,(sizey)*2+12,sy+sizey+7)}else{_sy=100}
SetWindowPos _combh,0,0,0,BMSCR(29),limit(sy,sizey*2+12,sy+sizey+7),$6 //SWP_NOMOVE | SWP_NOZORDER
SetWindowPos _combh,0,0,0,0,0,$27 //SWP_NOMOVE | SWP_NOZORDER |SWP_FRAMECHANGED | SWP_NOSIZE
return _cb_id
//cb_idにcomboxexで取得したID指定して選択状態にする
#deffunc combsel int cb_id
_combh=objinfo(cb_id,2)
return _combh
//iに選択通のインデックス、txtに選択中の項目の文字列を取得(リストが閉じてる時はエディット内文字列)
//statにドロップダウンリストの表示状況が返る[0=閉じてる 1=開いてる]
#deffunc combget var i,var txt
txt=""
memexpand txt,256
sendmsg _combh,$0157,0,0 //CB_GETDROPPEDSTATE = $0157; // ドロップダウンリストの表示状況の取得
df=stat
sendmsg _combh,$0147,0,0 // CB_GETCURSEL = $0147; // リストボックスの選択項目インデックスの取得
i=stat
if df{
sendmsg _combh,$0148,i,varptr(txt) // CB_GETLBTEXT= $0148;任意リスト項目の文字列を取得
}else{
sendmsg _combh,$000D,255,varptr(txt) //WM_GETTEXT $000D
}
return df
//cb_strに検索する文字列、cb_iに検索開始インデックス(省略か-1で最初から)、find_fに検索モード(省略時0)[0=完全一致 1=前方一致 2=前方一致した項目をエディト表示 3=指定インデックスの項目をエディト表示]
//statに検索結果が返る[-1なら見つからなかった]
//cb_iに指定した数値以下が返ってきたら指定インデックスより先には同じ文字列は無い
#define global ctype combfind(%1,%2=-1,%3=0) _combfind(%1,%2,%3)
#defcfunc _combfind str cb_str,int cb_i,int find_f
if find_f=0 {
sendmsg _combh,$0158,cb_i,cb_str //CB_FINDSTRINGEXACT = $0158; // リストボックス項目内の文字列検索
}else{
sendmsg _combh,$014B+find_f,cb_i,cb_str // CB_FINDSTRING = $014C; // リストボックス項目内の文字列検索; CB_SELECTSTRING = $014D; // 文字列を検索し見つかったら選択してエディットに表示; CB_SETCURSEL = $014E; // 特定項目を選択してエディットに表示
}
return stat
//txtに全リストを取得
//statに項目数が返る
#deffunc comblist var txt
txt=""
sendmsg _combh,$0146,0,0 // CB_GETCOUNT= $0146;リストボックスの項目数の取得
if stat<=0 {return 0}
cb_cunt=stat
memexpand txt,256*cb_cunt
repeat cb_cunt
sendmsg _combh,$0148,cnt,varptr(txt)+strlen(txt)// CB_GETLBTEXT= $0148;任意リスト項目の文字列を取得
txt+"\n"
loop
poke txt,strlen(txt)-2,0
return cb_cunt
#global
#include "mod_PdhPC.hsp"
#define global OBJECT 0
#define global INSTANCE 1
#define global COUNTER 2
#define global INPUT_OBJ 0
#define global MESBOX_OBJ 1
#define global BUTTON_OBJ 2
TYPE_SIZE="PERF_SIZE_DWORD\n","PERF_SIZE_LARGE\n","PERF_SIZE_ZERO\n","PERF_SIZE_VARIABLE_LEN\n"
sdim TYPE_MES,,8,4
TYPE_MES(0,0)="PERF_NUMBER_HEX「16進数表示を推奨。」\n","PERF_NUMBER_DECIMAL「10進数表示を推奨。」\n","PERF_NUMBER_DEC_1000「1000で除算してから10進数表示を推奨。」\n"
TYPE_MES(0,1)="PERF_COUNTER_VALUE「カウンタの値は、そのまま表示されます。」\n","PERF_COUNTER_RATE「カウンタの値は経過時間で除算されます。」\n","PERF_COUNTER_FRACTION「次のカウンタのタイプが PERF_COUNTER_BASE の場合、カウンタの値は次のカウンタが示している基本値で除算されます。それ以外の場合は、カウンタ サブタイプの値で除算されます。」\n","PERF_COUNTER_BASE「カウンタの値は、分数で使用される基本値です。」\n","PERF_COUNTER_ELAPSED「カウンタの値は開始時間で、現在の時間から減算されます。」\n","PERF_COUNTER_QUEUELEN「パフォーマンス アプリケーションは、キューの長さカウンタを使用します。次のカウンタは現在のキューの中の数です。次のカウンタに、このカウンタのサブタイプによって指定される単位からなる現在の時間を乗算します。この積をカウンタの元の値に加算します。平均のキューの長さは、この合計値を経過時間で除算して出します。」\n","PERF_COUNTER_HISTOGRAM「カウンタの値は、ヒストグラムを開始または終了します。」\n","PERF_COUNTER_PRECISION「PERF_COUNTER_PRECISION」\n"
TYPE_MES(0,2)="PERF_TEXT_UNICODE\n","PERF_TEXT_ASCII\n"
TYPE_MES(0,3)="PERF_TYPE_ZERO\n"
TYPE_TIMER="PERF_TIMER_TICK「高解像度のパフォーマンス カウンタの周波数をベースとして使用します。」\n","PERF_TIMER_100NS「100 ナノ秒単位の時間基準タイマをベースとして使用します。」\n","PERF_OBJECT_TIMER「オブジェクト タイマの周波数をベースとして使用します。この値は、このカウンタの PERF_OBJECT_TYPE 定義内にシステムが定義したものです。」\n"
DISPLAY="PERF_DISPLAY_NO_SUFFIX「ディスプレイ サフィックスはありません。」\n","PERF_DISPLAY_PER_SEC「ディスプレイ サフィックスは /sec です。」\n","PERF_DISPLAY_PERCENT「ディスプレイ サフィックスは % です。」\n","PERF_DISPLAY_SECONDS「ディスプレイ サフィックスは secs です。」\n","PERF_DISPLAY_NOSHOW「カウンタ値は表示されません。」\n"
ptc="PERF_TYPE_NUMBER「カウンタ データは数値ですが、カウンタではありません」\n","PERF_TYPE_COUNTER「カウンタ データは増加する数値です」\n","PERF_TYPE_TEXT「カウンタ データはテキスト フィールドです」\n","PERF_TYPE_ZERO「カウンタ データは常にゼロです」\n"
calculate="PERF_DELTA_COUNTER「前のカウンタ値と現在のカウンタ値の差異を計算してから、処理を行います」\n","PERF_DELTA_BASE「前の基本値と現在の基本値の差異を計算してから、処理を行います」\n","PERF_INVERSE_COUNTER「他のすべての計算を行った後でカウンタを反転してから、これを表示するか、パーセントに変換します」\n","PERF_MULTI_COUNTER「この値は複数のソースのカウンタの合計です。ソースの数は次のカウンタに示されます」\n"
infname="dwType;","CVersion;","CStatus;","lScale;","lDefaultScale;","dwUserData;","dwQueryUserData;","szFullPath;","szMachineName;","szObjectName;","szInstanceName;","szParentInstance;","dwInstanceIndex;","szCounterName;","szExplainText;"
sdim input_str,,COUNTER+1
sdim listbox_str,,COUNTER+1
listbox_str(OBJECT)={"
LogicalDisk
PhysicalDisk
Server
Server Work Queues
Redirector
Browser
Cache
Processor
Memory
Objects
Paging File
System
Process
Thread
Job Object
Job Object Details"}
objsize 300,25,20
pos 20,10
button goto "PdhEnumObjectsを使い全てのObjectを取得する",*label
poeon_id=stat
pos 0
mes {"PdhEnumObjectsを使うとwmiapsrvとwmiprvseは二つ実行され常駐します
wmiprvseの一つは数分で消えますが、wmiapsrvは、このソフト終了まで残り
その後10分程度でwmiprvseが消えます。(OSや設定の違いで状況は変るかもしれない)
[これはPdhEnumObjectsを使用しなくてもObjectのWMI Objectsや
ProcessorPerformanceを選択した時にwmi関係が常駐する可能性がある]"}
pos 20,200
button goto "予め下記に用意したObjectのみを使用する(編集可能)",*label
poeoff_id=stat
pos 50
mesbox listbox_str(OBJECT),200,200,1,1024
stop
*label
peo_f=stat
screen 0,1024,600
dim listindex,COUNTER+1
repeat length(listindex)
listindex_bak(cnt)=-1
loop
dim objid,BUTTON_OBJ+1,COUNTER+1
mes "WMI関係を稼働させます。暫くお待ちください。\n"
if peo_f=oeon_id {
//PdhEnumObjects使用前にWMIを起動させとく(WMIの起動に時間がかかるので)
GetInstanceCounterList InstanceList,InstanceMAX,CounterList,CounterMAX,"WMI Objects",1
mes "ObjectにProcessorPerformanceが有るか確認中。\n"
repeat
GetInstanceCounterList InstanceList,InstanceMAX,CounterList,CounterMAX,"Processor",1
wait 10
GetInstanceCounterList InstanceList,InstanceMAX,CounterList,CounterMAX,"ProcessorPerformance",1
if stat=0{mes "ProcessorPerformanceが確認されました。\n":break}
if cnt>=4{
dialog "ProcessorPerformanceが確認出来ませんでした。\nもう一度確認しますか?",2
if stat=7 {break}
}
loop
mes "Object取得開始します。数秒かかる場合があります。"
//GetObjectListの内部でPdhEnumObjectsを使用している
GetObjectList listbox_str(OBJECT),1
}
patnam="Object","Instance","Counter"
butnam="ObjectListをmesboxにコピー","InstanceListをmesboxにコピー","CounterListをmesboxにコピー"
butlab=*mesboxcopy,*mesboxcopy,*mesboxcopy
color 255,255,255
boxf
color
repeat 3
pos 40+cnt*320,0
objsize 300,100
mes patnam(cnt)
pos ginfo_mesx+48+cnt*320,0
input input_str(cnt),200,20
objid(INPUT_OBJ,cnt)=stat
pos 40+cnt*320,ginfo_cy+4
listbox listindex(cnt),200,listbox_str(cnt)
objid(MESBOX_OBJ,cnt)=stat
objsize 200,18
button gosub butnam(cnt),butlab(cnt)
objid(BUTTON_OBJ,cnt)=stat
loop
pos 12,350
objmode 2
font "MS 明朝",18
FullPath=""
input FullPath,1000,20
fp_id=stat
CounterInfo=""
mesbox CounterInfo,1000,220,4
inf_id=stat
sysfont 0
repeat
await 16
if listindex(OBJECT) ! listindex_bak(OBJECT) and listindex(OBJECT)>=0 {//OBJECTの選択変更された
listindex_bak(OBJECT)=listindex(OBJECT)
notesel listbox_str(OBJECT)
noteget input_str(OBJECT),listindex(OBJECT)
if peo_f=oeon_id {//一度PdhEnumObjectsを使用するとInstanceListが更新されなくなる(理由不明)ので自分で更新
GetObjectList
}
repeat
GetInstanceCounterList listbox_str(INSTANCE),InstanceMAX,listbox_str(COUNTER),CounterMAX,input_str(OBJECT),1
if (stat=0) {break}else{
if (PDH_CSTATUS_NO_OBJECT = stat) {
dialog "カウンタリストの取得に失敗しました\nObjectが存在しないかスペルミスの可能性があります\nwmi関係だと再取得で成功する可能性がある\n再取得しますか?\nerr"+strf(" 0x%08x",stat),2
if stat=6 {
//wmi関係だと連続で同じObjectのカウンタ取得は上手く行かない事があるので一度別のを取得
GetInstanceCounterList InstanceListtmp,InstanceMAXtmp,CounterListtmp,CounterMAXtmp,"Processor",1
}else{break}
}else{dialog "カウンタリストの取得に失敗しました\n"+strf(" 0x%08x",stat):break}
}
loop
if listbox_str(INSTANCE) = "" {
InstanceMAX=0
}else{//GetInstanceCounterListでInstanceListを取得出来るが同じ名前のInstanceを区別できないのでGetWildCardPathでインデックス付を取得
GetWildCardPath listbox_str(INSTANCE),"\\"+input_str(OBJECT)+"(*/*)\\",1,1
InstanceMAX=stat
}
objprm objid(INPUT_OBJ,OBJECT), input_str(OBJECT)
objprm objid(INPUT_OBJ,COUNTER), ""
objprm objid(INPUT_OBJ,INSTANCE), ""
listindex_bak(INSTANCE)=-1
objprm objid(MESBOX_OBJ,INSTANCE), listbox_str(INSTANCE)
objprm objid(MESBOX_OBJ,INSTANCE), 0
listindex_bak(COUNTER)=-1
objprm objid(MESBOX_OBJ,COUNTER), listbox_str(COUNTER)
objprm objid(MESBOX_OBJ,COUNTER), listindex_bak(COUNTER)
}
if listindex(INSTANCE) ! listindex_bak(INSTANCE) and listindex(INSTANCE)>=0 {//INSTANCEの選択変更された
listindex_bak(INSTANCE)=listindex(INSTANCE)
objprm objid(MESBOX_OBJ,INSTANCE),listindex(INSTANCE)
notesel listbox_str(INSTANCE)
noteget input_str(INSTANCE),listindex(INSTANCE)
objprm objid(INPUT_OBJ,INSTANCE), input_str(INSTANCE)
listindex_bak(COUNTER)=-1
}
if listindex(COUNTER) ! listindex_bak(COUNTER) and listindex(COUNTER)>=0 {//COUNTERの選択変更された
listindex_bak(COUNTER)=listindex(COUNTER)
notesel listbox_str(COUNTER)
noteget input_str(COUNTER),listindex(COUNTER)
objprm objid(INPUT_OBJ,COUNTER), input_str(COUNTER)
DelPerformanceCounter cid //今稼働してるカウンタを削除
repeat 2
if AddPerformanceCounter( 0,input_str(OBJECT),input_str(INSTANCE),input_str(COUNTER))>=0 {//カウンタID追加成功
cid=stat:path=refstr:c_on=1:break //関数型の戻り値が整数型の場合statにも返るので利用
}else{
if -1=stat and input_str(INSTANCE)=""{//INSTANCEが必要なOBJECTでも今はINSTANCEが取得できない場合もあるので*で誤魔化す(この場合カウンタIDは有効だがデータは受け取れない)
input_str(INSTANCE)="*/*"
objprm objid(INPUT_OBJ,INSTANCE), input_str(INSTANCE)
}else{
dialog "カウンターの追加に失敗しました\nerr"+strf(" 0x%08x",stat)
end
}
}
loop
//---------カウンタ値取得時の形式を指定--------
//[SetPCFMT カウンタID, データの前に" [data="を後ろに"]"を追加してデータ表示形式は GetStrfFMT(cid,,1) で既定の表示方法取得して指定]
SetPCFMT cid," [data="+GetStrfFMT(cid,,1)+"]",,,3
CounterInfo=""
//---------稼働してるカウンタの情報を取得----
//[GetCounterAllInfo カウンタの情報を取得する文字列型変数, カウンタID, 配列で取得]
GetCounterAllInfo CounterInfo,cid,0
//要素数14にあるカウンタ説明を"。"で改行
strrep CounterInfo(14),"。","。\n"
CounterInfo(14)+"\n\ndwType; "+CounterInfo+"\n"
dwType=int(CounterInfo)
CounterInfo(14)+"<データサイズ> "+TYPE_SIZE((dwType&$300)/$100)
sdim Strf_Format_Type,,8,4
ct=(dwType & 0x00000c00) /$400
CounterInfo(14)+"<カウンタタイプ> "+ptc(ct)+"<数字の形式> "+TYPE_MES(((dwType&$f0000)/$10000),ct)
if (ct=1) and ((dwType&$30000) ! $30000) {
CounterInfo(14)+"<カウンタのサブタイプ> "+TYPE_TIMER((dwType&$30000)/$10000)
}
dt=$400000
repeat 4
if dt&dwType {
CounterInfo(14)+"<計算方法> "+calculate(cnt)
}
dt*2
loop
CounterInfo(14)+"<DISPLAY> "+DISPLAY((peek(dwType,3)&$f0)/$10)+"\n"
repeat 13,1
CounterInfo(14)+infname(cnt)+" "+CounterInfo(cnt)+"\n"
loop
objprm inf_id, CounterInfo(14)
objprm fp_id, CounterInfo(7)
}
if (gettime(6) ! tim) and c_on=1{
tim=gettime(6)
CollectQueryData 0
if stat=0 {
cdata=""
//-----追加したパフォーマンスカウンタのデータを受け取る------
//[GetPerformanceCounter 受け取る変数に文字列型を使用, カウンタIDを指定, 配列指定]
GetPerformanceCounter cdata, cid,0
title path+cdata
}else{
title path+" [data=PDH_NO_DATA]"
c_on=0
}
}
loop
*mesboxcopy
repeat 3
if objid(BUTTON_OBJ,cnt)=stat {objprm inf_id, listbox_str(cnt):break}
loop
return
| |
|
2014/11/21(Fri) 23:09:15|NO.66129
>暇人 さん
スレ主ではありませんが、pdh.dllの関数の使い方がいまいち分からなかったので参考になりました。
|
|
2014/11/21(Fri) 23:24:31|NO.66130
オマケのCPU使用率取得サンプル
#include "mod_PdhPC.hsp"
//-------CPUのパフォーマンスカウンタを設定--------
//[cid=AddProcessPerformanceCounter( クエリーID0指定, CPU使用率のカウンタータイプ指定)]
cid=AddProcessPerformanceCounter( 0,P_PROCESSOR_TIME) //AddCPUPerformanceCounter(,)にすると各コアの使用率になる
if cid<0{dialog "カウンタが設定できなかった":end}
//-------ワイルドカード付きのカウンタパスを展開--------
//[GetWildCardPath リストを受け取る変数,AddProcessPerformanceCounterで使われたパスがrefstrに返るので利用]
GetWildCardPath InstanceList,refstr
if stat>0 {TotalProcess=stat}else{dialog "カウンタが設定できなかった":end}
//-------カウンタを文字列で取得する時の形式設定--------
//[SetPCFMT cid,"strf()の形式6文字実数で末尾に%付き",カウンタ値取得時_Totalを除外]
SetPCFMT cid,"%6.2f %%",1
screen 0,200,60+18*TotalProcess,0,0,0
gsel 0,2
Set_Wait=100
cpupcdata=""
InstanceList=""
repeat
redraw 0
color 255,255,255
boxf
color
//-------カウンタ更新--------
//[CollectQueryData クエリーID0指定]
CollectQueryData 0
//-----Aパフォーマンスカウンタを受け取る------
//[GetPerformanceCounter 受け取る変数に文字列型を使用, カウンタID指定, 最後除き改行]
//ProcessPerformanceCounterで P_の付くカウンターを使用した時はCPUコア数で割られた結果になります
GetPerformanceCounter cpupcdata, cid,1
if stat>0 {
ptotal=stat
//-----カウンタ値を受け取った後にインスタンス名を全て取得する------
//[GetInstanceNameList 受け取る変数, 最後除き改行]
GetInstanceNameList InstanceList,1
}//GetPerformanceCounterのstatが0だった場合前回のを使う
pos 0,0
mes "Process["+refstr+"]"
pos 10,20
mes InstanceList
mes "Process("+ptotal+")"
pos 130,20
mes cpupcdata
title " "+gettime(4)+"時 "+gettime(5)+"分 "+gettime(6)+"秒"
redraw 1
wait Set_Wait
loop
| |
|
2014/11/22(Sat) 13:46:43|NO.66133
皆さんありがとうございます。
ですが、私の環境ではカウンタが取得できないようです....
えらーは0x800007d0だそうです。
うーん...
|
|
2014/11/22(Sat) 14:40:04|NO.66134
エラーコードは
PDH_CSTATUS_NO_MACHINE
らしいけど
許可されてないアクセス権がどうこうとか
こっちからじゃ分からないな・・・
|
|
2014/11/22(Sat) 14:48:11|NO.66135
よくよく調べたらパフォーマンスモニターがなんとか...
私の環境だとパフォーマンスモニターが起動しないので
もしかしたらそこら辺の問題かもしれません.....
一応システムスキャンを行ってみます。
|
|
2014/11/22(Sat) 15:34:47|NO.66137
やっと私の環境で正常に動作しました。
>mes ""+GetInstanceName(cnt)+" ["+cdata(cnt)+"]"
ココがよく100%を超える(特にベンチマーク中など)のですが、
コレは仕様と割り切ったほうがいいでしょうか?
|
|
2014/11/22(Sat) 16:08:58|NO.66138
>SetPCFMT cid,"6.2",,,3
これを
SetPCFMT cid,"6.2",,,1
にすると最大100.0になると思う
|
|
2014/11/22(Sat) 16:28:39|NO.66139
>暇人 さん
ありがとうございます!100%になりました!
そして私のやりたいこともこれで出来そうです。
本当にありがとうございました。
|
|