2011-04-07 16 views
5

En Windows, los contadores de rendimiento tienen diferentes nombres, según el idioma del sistema operativo. Por ejemplo, en una versión de Windows en inglés, está el contador de rendimiento \Processor(_Total)\% Processor Time. El mismo contador se llama \Prozessor(_Total)\Prozessorzeit (%) en una versión alemana de Windows.Recuperar el valor del contador de rendimiento de forma independiente del idioma

¿Hay alguna forma de recuperar el valor del contador de rendimiento de una manera independiente del lenguaje (usando C++ o C#)? ¿O hay una alternativa para obtener la carga del procesador de toda la computadora sin contadores de rendimiento?

+0

¿* Has intentado * usar el nombre en inglés en tu código en una máquina alemana? –

+2

Sí, lo he intentado y aparece el mensaje de error de que no se puede encontrar el contador. –

Respuesta

7

A cada contador PerfMon se le asigna una identificación única (por máquina) para identificar el contador PerfMon (sin embargo, en el caso de los contadores estándar, se garantiza que esta identificación permanezca igual).

La información de vinculación de Monitor de rendimiento contadores de identificación tanto a su nombre de EE.UU. Inglés y su nombre localizada se almacena en el registro en la siguiente clave:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib 

Una vez que haya utilizado el registro para obtener el nombre del contador Monitor de rendimiento (que puede insertar en su aplicación como una constante para contadores estándar) puede usar la función PdhLookupPerfNameByIndex para buscar el nombre localizado para la ID del contador dado.

Ver Using PDH APIs correctly in a localized language (Microsoft KB) para más detalles.

También puede encontrar Finding perfmon counter id via winreg (StackOverflow) algo relevante.

+0

Comparé las identificaciones y algunas de ellas son diferentes en otras computadoras. Pero hay una solución alternativa: busco la identificación en la clave "009" usando el nombre en inglés, luego busco el nombre localizado utilizando la función PdhLookupPerfNameByIndex. Código fuente: http://wojciechkulik.pl/csharp/get-a-performancecounter-using-english-name –

0

Existen las funciones de WinAPI, QueryHighPerformanceCounter y QueryHighPerformanceFrequency.

+0

¡En realidad no hay "alto" en los nombres! – Nawaz

+0

Estas funciones devuelven los valores de un temporizador de alta precisión que se usa para los contadores de rendimiento. Pero no puede usar estas funciones para devolver el valor de un contador de rendimiento como \ Processor (_Total) \% Processor Time. –

0

¿Ha intentado utilizar las funciones de ayuda Pdh y la función PdhAddEnglishCounter?

+0

Desafortunadamente, esta función solo está disponible en Vista, Windows Server 2008 y posteriores. También necesito recuperar contadores de rendimiento en Windows XP y Windows Server 2003. –

0

Añadir este

using System.Runtime.InteropServices; 
using Microsoft.Win32; 

En su importación clase de la DLL (mi clasifican lleva el nombre del programa)

[DllImport("pdh.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
     static extern UInt32 PdhLookupPerfIndexByName(string szMachineName, string szNameBuffer, ref uint pdwIndex); 

enviar el nombre del contador que desea en su idioma del sistema operativo y devolverlo al Inglés NOMBRE

public string GetEnglishName(string name) 
     { 
      string buffer2 = name; 
      UInt32 iRet2 = new UInt32(); 
      iRet3 = PdhLookupPerfIndexByName(null, buffer2, ref iRet2); 
      //Console.WriteLine(iRet2.ToString()); 

      RegistryKey pRegKey = Registry.LocalMachine; 
      pRegKey = pRegKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"); 
      string[] after; 
      after = (string[])pRegKey.GetValue("Counter"); 
      string value = iRet2.ToString(); 
      int pos = Array.IndexOf(after, value); 
      return after[pos + 1]; 
     } 

Aquí es cómo usarlo

Program m = new Program(); 
      string result = m.GetEnglishName("Mémoire"); 
      Console.WriteLine(result); 
Cuestiones relacionadas