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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1118
科学太郎ディスク情報の取得方法を探してます5未解決


科学太郎

リンク

2015/11/18(Wed) 09:57:20|NO.73095

[環境]
Windows 8.1
HSP Ver.3.32

[質問]
Windows 8.1のタスクマネージャで「パフォーマンス」タブのディスク情報の取得方法を探してます。

・アクティブな時間
・平均応答時間
・読み取り速度
・書き込み速度

・パフォーマンス・モニターの設定
http://www.venus.dti.ne.jp/~yoshi-o/Windows/Performance_Monitor.html

パフォーマンス・オブジェクトとカウンタは何とか分かりました。
あとは具体的な記述ですが、上記のリンクの「(*)」部分が良く分かりません。

・CPU使用率の取得
http://blog.goo.ne.jp/masaki_goo_2006/e/6b48817a6c93940e70667e6d6c7ec8ed

今のところCPU使用率と同じやり方だとは思ってますが、
PdhAddCounter 関数に追加する文字列が良く分かりません。

また、PdhAddCounter 関数に複数のドライブを追加したとき、
PdhGetFormattedCounterValue 関数などで複数取り出す方法が知りたいです。

こちらの環境では

ディスク0(C: D:) ディスク1(G:) ディスク2(F:)
となってます。

なぜか
「ディスク1」が「G:」で
「ディスク2」が「F:」になってるが。



この記事に返信する


暇人

リンク

2015/11/18(Wed) 18:35:25|NO.73104

HDDアクセス率の取得
http://hsp.tv/play/pforum.php?mode=pastwch&num=66119
のNO.66127にある程度のpdh命令をモジュール化したのと"% Disk Time"のサンプルがあります。

後NO.66128にオブジェクト、Instanceやカウンタの一覧や説明
具合的な書式を表示するスクリプトがあります。

モジュールを使用したコア毎の使用率表示サンプル

#include "mod_PdhPC.hsp" //-------CPUのパフォーマンスカウンタを設定-------- //[cid=AddCPUPerformanceCounter( クエリーID0指定, CPU使用率のカウンタータイプ指定)] cid=AddCPUPerformanceCounter( 0,P_PROCESSOR_TIME) if cid<0 {dialog "カウンタが設定できなかった":end} //-------カウンタを文字列で取得する時の形式設定-------- //[SetPCFMT cid,"カウンタ規定の文字列形式で6文字小数部2文字で既定の末尾で%が付く"] SetPCFMT cid,"6.2" //TotalCPUCoreでコア数取得 screen 0,200,40+16*(TotalCPUCore+1),0,0,0 gsel 0,2 Set_Wait=100 cpupcdata="" //GetPerformanceCounterを文字列で取得するので文字列で初期化 (実数なら実数で、整数なら整数の変数を渡す) repeat redraw 0 color 255,255,255 boxf color //-------カウンタ更新-------- //[CollectQueryData クエリーID0指定] CollectQueryData 0 //-----AddCPUPerformanceCounterで設定したパフォーマンスカウンタを受け取る------ //[GetCPUPerformanceCounter 受け取る変数に文字列型を使用, カウンタID指定, 改行せずに配列にする] GetPerformanceCounter cpupcdata, cid,0 if stat<=0 {dialog "カウンタ値が取得できなかった":end} total=stat pos 0,0 mes "CPU["+refstr+"]" repeat total pos 20,20+cnt*16 if cnt=(total-1) {mes "CPU平均"}else{mes "CPU("+(cnt+1)+")"} pos 100,20+cnt*16 mes cpupcdata(cnt) loop title " "+gettime(4)+"時 "+gettime(5)+"分 "+gettime(6)+"秒" redraw 1 wait Set_Wait loop



科学太郎

リンク

2015/11/19(Thu) 10:24:55|NO.73115

> のNO.66127にある程度のpdh命令をモジュール化したのと"% Disk Time"のサンプルがあります。
なかなかボリュームがありますね。

> モジュールを使用したコア毎の使用率表示サンプル
参考になります。

サンプルやモジュールが長いので
じっくりと解読したいと思います。



科学太郎

リンク

2015/11/19(Thu) 15:06:32|NO.73118

一括で複数の情報を収集する場合は「PdhAddCounter」で複数登録して、
「PdhCollectQueryData」を実行後に「PdhGetFormattedCounterArray」で取得すれば良いのでしょうか?

あと No.66127 のサンプルを実行してるとファイルの書き込み時に
「100%」を超えて「30200.00%」などになることがあります。

「ぬねの」さんも No.66137 で疑問を持っていて、
「暇人」さんが次の No.66138 で「3」を「1」にすれば良いと書かれてます。
しかし、SetPCFMT 命令のコメントには「3」が「100%を上限にします」となってます。
もしかして「0」と「3」の意味が逆転してるのですか?

あと「PhysicalDisk」と「LogicalDisk」の違いは何?
名前からすると物理ディスクとローカル・ディスクなのでしょうが…?!



暇人

リンク

2015/11/19(Thu) 21:40:39|NO.73128

>「PdhGetFormattedCounterArray」で取得すれば良いのでしょうか?
複数登録したカウンタを一度に取得する命令では無い
指定したオブジェクトに複数のInstanceがある場合ワイルドカードが使用でき
複数のInstanceのカウンタ値を一括で取得する命令
この辺はHSPとは関係ないので他で聞く方が良いかも(自分も詳しいわけではないので・・・)

>cid=AddPerformanceCounter( 0, "LogicalDisk","*/*","% Disk Time"
の"*/*"がワイルドカードで使用できるInstance(この場合ローカルディスク)全てに
カウンタが設定される
GetPerformanceCounter命令の中ではPdhGetFormattedCounterArrayを使用してカウンタ値を取得してる

>もしかして「0」と「3」の意味が逆転してるのですか?
カウンタ毎に取得できる値のタイプが違うのが原因だと思う
%用のカウンタは規定で100%に制限されてるものと違うのがある
3を指定すると規定で100%に制限されるのを利用してるだけ
0は0x00008000(PDH_FMT_NOCAP100)を指定して上限を無くす。
なのでモジュール内の説明が間違ってる訳ではありません。

1は0x00001000(PDH_FMT_NOSCALE)指定して既定のスケールを使わない事で
"% Disk Time"の場合は100%に制限されるようです。

>あと「PhysicalDisk」と「LogicalDisk」の違いは何?
簡単に言うとディスク単位かディスク含むパリティー単位の違い
>ディスク0(C: D:)
>ディスク1(G:)
>ディスク2(F:)
は、PhysicalDiskの場合
0 C: D:
1 G:
2 F:
で、LogicalDiskの場合は
C:
D:
G:
F:
になる


モジュール内説明間違い
>//-------カウンタ値を受け取る--------
>//[GetProcessPerformanceCounter cdata, cid, strf_fmt, cr, byt]


//[GetPerformanceCounter cdata, cid, strf_fmt, cr]
でした

>//--------ワイルドカードを使用したパスを展開して取得------
>//[GetWildCardPath mszExpandedPathList, szWildCardPath, OCdel]


//[GetWildCardPath mszExpandedPathList, szWildCardPath, cr, OCdel]
に修正(たぶん修正途中で放置したから説明が修正されてなかった・・・他にもあるかも・・・)


NO.73104の
>//[GetCPUPerformanceCounter 受け取る変数に文字列型を使用, カウンタID指定, 改行せずに配列にする]
は GetPerformanceCounter (古い方で作ったサンプルを利用したから修正漏れ・・・)



http://cc.bingj.com/cache.aspx?q=PhysicalDisk&d=4636444473432195&mkt=ja-JP&setlang=ja-JP&w=kRmituhbsRI8aT-GZXShAAyUB7nIO6aF

>_Total インスタンスは、マルチディスク システムでの使用状況を正確に反映しないことがあるため、% Idle Time カウンタも併せて使うことが重要です。
とあるので同じクエリーに"% Disk Time"と"% Idle Time"を登録取得するサンプル


#include "mod_PdhPC.hsp" //-------オブジェクト、インスタンス、カウンタを指定してパフォーマンスカウンタをクエリーに追加-------- //[cid=AddPerformanceCounter id, Object, Instance, Counter] cid=AddPerformanceCounter( 0, "LogicalDisk","*/*","% Disk Time") if stat<0 {dialog "カウンタが設定できなかった":end} FullPath=refstr //カウンタフルパス代入 title FullPath cid(1)=AddPerformanceCounter( 0, "LogicalDisk","*/*","% Idle Time") //同じクエリーID0にウンタを追加 if stat<0 {dialog "カウンタが設定できなかった":end} //---------カウンタ値取得時の形式を指定-------- //[SetPCFMT cid, 6文字で小数点以下2文字, (省略_total含む), (省略1.0で割る), 既定のスケールを使わない] SetPCFMT cid,"6.2",,,1 SetPCFMT cid(1),"6.2",,,1 //--------ワイルドカードを使用したパスを展開して取得------ //[GetWildCardPath インスタンスリストを取得する変数, ワイルドカードを含むカウンタパス, 改行して取得] GetWildCardPath InstanceList, FullPath, 1,1 if stat=0 {dialog "Instanceリストが取得できなかった":end} total=stat //リストの数 font "MS ゴシック",20 screen 0,300,20+20*total 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} pos 0,20 mes InstanceList repeat 2 //"% Disk Time"と"% Idle Time"で2回取得 pos 60+cnt*120,0 //-----AddPerformanceCounterで追加したパフォーマンスカウンタを受け取る------ //[GetPerformanceCounter 受け取る変数に文字列型を使用, 追加したカウンターIDを指定, 配列指定] GetPerformanceCounter cdata, cid(cnt),0 i=stat mes refstr if i>0 { repeat i mes "["+cdata(cnt)+"]" loop } loop redraw 1 wait Set_Wait loop



暇人

リンク

2015/11/19(Thu) 22:04:43|NO.73129

あ、キャッシュのアドレス貼ってた・・・
https://msdn.microsoft.com/ja-jp/library/cc759363(v=ws.10).aspx



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