HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1121
ぬねのHDDアクセス率の取得16解決


ぬねの

リンク

2014/11/21(Fri) 19:30:21|NO.66119

今ちょっとしたソフトを作成しているのですが
HDD使用率などの取得サンプルはあるものの、HDDアクセス率のサンプルがどこにもありません。
前のPCがWindows8でタスクマネージャーのHDDアクセス率が便利だったのですが、
やはりWindows8以降でないとアクセス率は取得出来ないのでしょうか?



この記事に返信する


cats

リンク

2014/11/21(Fri) 20:08:26|NO.66121

気になったので少し調べてみました。
どうやらpdhというライブラリを使用することで可能なようです。
合っているかは分かりませんが参考になりそうなリンクを挙げておきます。
http://msdn.microsoft.com/ja-jp/library/microsoft.sqlserver.dts.runtime.wrapper.idtsperfrecorder100.getcountervalues.aspx
http://msdn.microsoft.com/ja-jp/library/cc429540.aspx
http://www.c-plusplus.net/forum/287706-full
http://weyk.la.coocan.jp/weyk/nadesiko/pdhlib.html
どこかに disk I/O のデータがあるはずなんですが、CPUの記事が多くてそこまでは分かりませんでした。



nepisat

リンク

2014/11/21(Fri) 20:38:41|NO.66122

とりあえず、Windows7にもhddの読み取り機能はあります。
確か98頃からあったような..
タスクマネージャーの表示が変わっただけです。

試していないし、できるかどうかもわからないけど予想
1、タスクマネージャーがDLLや別のアプリケーションから情報取得しているのなら
それを実行し、HSPに何らかの方法で流し込む。

2、なんとなくエクスプローラー関連でありそう
3、MSDNライブラリを探して見るとありそう
4、あったとしてもリアルタイムで動いているアクセス情報がどのように送られてくるかが不明



ぬねの

リンク

2014/11/21(Fri) 21:01:57|NO.66123

うーん....
やっぱ探しても出てこない...
>http://weyk.la.coocan.jp/weyk/nadesiko/pdhlib.html
なでしこはちょっとだけかじったことがあるのですが
私の環境だとすべて-1になってしまいました。
もうちょっと単語変えて探したほうがいいのかなぁ......



nepisat

リンク

2014/11/21(Fri) 21:35:54|NO.66124

よく考えたら
小さいファイルのコピーを高速に行って、xcopy等で情報を受け取り
そこから平均を求める。
ただし、計算方法を考えなければならないため、オープンソースのベンチマークソフト等から
計算方法を考えなければいけないかも
http://stackoverflow.com/questions/187768/can-i-show-file-copy-progress-using-fileinfo-copyto-in-net
http://stackoverflow.com/questions/16933104/get-transfer-speed-from-fileinfo-copyto-in-c-sharp

C#ですが使えるはず...



cats

リンク

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
とりあえず真っ先に思いついて書けたので挙げておきます。



cats

リンク

2014/11/21(Fri) 22:41:27|NO.66126

No.66125の参考文献を書き忘れていました。
http://d.hatena.ne.jp/labunix/20111023
http://hsp.tv/play/pforum.php?mode=pastwch&num=58796

あと取得しているのは全体のI/Oの平均です。
詳しいことはtypeperfを調べて下さい。
もしかしたら高速化できるかもしれません。(本当に思いつきで書いたので)



暇人

リンク

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



cats

リンク

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%になりました!
そして私のやりたいこともこれで出来そうです。
本当にありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.