2

我正在使用 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 有很多经验并以最好的方式检索这些值?

谢谢,

史蒂夫

4

1 回答 1

2

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

(您可能可以将更多的行压缩在一起,例如EnumVariant enumVariant = new EnumVariant( mActiveXWMI.invoke("ExecQuery", new Variant(query)).toDispatch() );-- 但这会使其更难阅读,并且不会提高性能或其他任何东西。)

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

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

于 2009-12-21T23:16:26.690 回答