【问题标题】:Better Code Using Jacob and WMI使用 Jacob 和 WMI 编写更好的代码
【发布时间】:2009-11-30 01:30:14
【问题描述】:

我正在使用 JACOB 通过 WMI 访问系统信息。我在网上没有找到太多关于 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());
}

正如您所见,仅针对一项循环遍历集合似乎没有多大意义。我想只查询查询语句中的一列,并尽可能快速有效地从中获取结果,并且开销尽可能少。

有没有人对 JACOB 有丰富的经验并以尽可能好的方式检索这些值?

谢谢,

史蒂夫

【问题讨论】:

    标签: java wmi jacob


    【解决方案1】:

    我的理解是,一般来说,WMI 将始终为任何 ExecQuery 返回一个包含零个或多个项目的集合。如果 JACOB 的 EnumVariant 类是从 WMI 接收信息的最佳方式(从我看到的示例中),那么您需要以一种或另一种方式枚举它。

    (您也许可以将几行压缩在一起,例如EnumVariant enumVariant = new EnumVariant( mActiveXWMI.invoke("ExecQuery", new Variant(query)).toDispatch() );--但这会使其更难阅读,并且对性能或任何其他方面都没有帮助。)

    如果您确定查询将返回不超过一项(如您的示例中所示),您可以将“while”更改为“if”语句(然后处理在您的“else”子句中失败的情况)。

    但除此之外......我认为它不会比你已经拥有的更短。

    【讨论】:

    • 再看一遍,看来你是对的。我会等着看其他人是否知道有什么不同,但现在我正在接受你对代码的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2013-01-14
    • 2017-08-19
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多