2009-11-30 40 views
2

我正在使用JACOB通過WMI訪問系統信息。我還沒有在網絡上找到WMI和Jacob的許多文檔,並且想知道是否可以在使代碼更有效率方面得到一些幫助。使用Jacob和WMI的更好的代碼

下面是代碼:

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的經驗,並以最好的方式檢索這些值?

感謝,

史蒂夫

回答

2

我的理解是,在一般情況下,WMI將始終返回零個或多個項目的集合任何使用ExecQuery。如果JACOB的EnumVariant類是從WMI接收信息的最佳方式(從我見過的示例中),那麼您需要通過這種或那種方式來枚舉它。

(你也許能夠幾行壓縮在一起,像EnumVariant enumVariant = new EnumVariant(mActiveXWMI.invoke("ExecQuery", new Variant(query)).toDispatch()); - 但是這使得它更難讀,並不會幫助提高性能或任何東西。)

如果你是一定的查詢將返回不超過一個項目 - 如您的示例 - 您可以將「while」更改爲「if」語句(然後處理在您的「else」子句中失敗的情況)。

但是否則......我不認爲它會比你已經有的短得多。

+0

看過後,看起來確實如此。我會等待看看其他人是否知道任何不同,但現在我正在接受你的建議。 – 2009-12-22 14:39:49