Mejor código con Jacob y WMI
Pregunta
Estoy usando JACOB para acceder a la información del sistema a través de WMI. No he encontrado mucha documentación para WMI y Jacob en la web y me preguntaba si podría obtener ayuda para hacer que el código sea un poco más eficiente.
Aquí está el código:
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());
}
Como se puede ver, no parece tener mucho sentido recorrer una colección para un solo elemento. Me gustaría consultar solo una columna en la declaración de consulta y obtener el resultado de la forma más rápida y eficiente posible, con la menor sobrecarga posible.
¿Alguien tiene mucha experiencia con JACOB y recupera estos valores de la mejor manera posible?
Gracias,
Steve
Solución
Entiendo que, en general, WMI siempre devolverá una colección de cero o más elementos para cualquier ExecQuery. Y si la clase EnumVariant de JACOB es la mejor manera de recibir la información de WMI (de los ejemplos que he visto), entonces debe enumerarla de una forma u otra.
(Es posible que pueda comprimir algunas líneas más juntas, como EnumVariant enumVariant = new EnumVariant (mActiveXWMI.invoke (" ExecQuery " ;, new Variant (query)). toDispatch ());
- pero eso hace que sea aún más difícil de leer, y no ayudará al rendimiento ni a nada.)
Si está seguro de que la consulta no devolverá más de un elemento, como en su ejemplo, puede cambiar el " while " a un " si " declaración (y luego maneje el caso donde falla en su " otra " cláusula).
Pero de lo contrario ... no creo que sea mucho más corto de lo que ya tienes.