2

JACOB を使用して、WMI 経由でシステム情報にアクセスしています。Web 上で WMI と Jacob に関するドキュメントをあまり見つけられなかったので、コードをもう少し効率的にするための助けが得られるかどうか疑問に思っていました。

コードは次のとおりです。

ActiveXComponent mActiveXWMI = new ActiveXComponent("winmgmts:\\\\localhost\\root\\CIMV2");
String query = "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name='_Total'";
Variant vCollection = mActiveXWMI.invoke("ExecQuery", new Variant(query));

EnumVariant enumVariant = new EnumVariant(vCollection.toDispatch());
Dispatch item = null;
while (enumVariant.hasMoreElements()) {
    item = enumVariant.nextElement().toDispatch();
    cpuUsage = Double.parseDouble(Dispatch.call(item, "PercentProcessorTime").toString());
}

おわかりのように、1 つの項目だけを取得するためにコレクションをループしてもあまり意味がないようです。クエリ ステートメントで 1 つの列に対してクエリを実行し、その結果をできるだけ迅速かつ効率的に取得し、オーバーヘッドをできるだけ少なくしたいと考えています。

JACOB の経験が豊富で、これらの値を可能な限り最良の方法で取得している人はいますか?

ありがとう、

スティーブ

4

1 に答える 1

2

私の理解では、一般に、WMI は常に ExecQuery に対して 0 個以上のアイテムのコレクションを返します。また、JACOB の EnumVariant クラスが (私が見た例から) WMI から情報を受け取る最良の方法である場合は、何らかの方法でそれを列挙する必要があります。

( -- のように、さらにいくつかの行を一緒に圧縮できるかもしれませんが、EnumVariant enumVariant = new EnumVariant( mActiveXWMI.invoke("ExecQuery", new Variant(query)).toDispatch() );それはさらに読みにくくなり、パフォーマンスなどには何の役にも立たないでしょう。)

例のように、クエリが複数のアイテムを返さないことが確実な場合は、「while」を「if」ステートメントに変更できます(そして、「else」句で失敗した場合を処理します)。

しかし、そうでなければ... あなたがすでに持っているものよりもずっと短くなるとは思いません.

于 2009-12-21T23:16:26.690 に答える