2010-05-30 23 views
5

Comment puis-je obtenir la charge CPU par cœur (cpu quadcore), en C#?Comment puis-je charger le processeur par cœur en C#?

Merci :)

+0

double possible de [Comment obtenir l'utilisation du processeur en C#?] (http: // stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c) – chakrit

+1

Vu cela, mais C'est la charge globale, j'ai besoin du noyau de PER. – JustFogMaxi

+0

Je l'ai trouvé: http://www.codegain.com/articles/csharp/windowsforms/how-to-display-processor-usage-of-dual-core-processors.aspx – JustFogMaxi

Répondre

7

Vous pouvez utiliser WMI ou l'espace de noms System.Diagnostics. De là, vous pouvez saisir l'un des compteurs de performance que vous souhaitez (mais il faut une seconde (1-1.5s) pour les initialiser - lire les valeurs est ok, seule l'initialisation est lente)

Le code peut alors ressembler à ceci:

using System.Diagnostics; 

    public static Double Calculate(CounterSample oldSample, CounterSample newSample) 
    { 
     double difference = newSample.RawValue - oldSample.RawValue; 
     double timeInterval = newSample.TimeStamp100nSec - oldSample.TimeStamp100nSec; 
     if (timeInterval != 0) return 100*(1 - (difference/timeInterval)); 
     return 0; 
    } 

    static void Main() 
    { 
     var pc = new PerformanceCounter("Processor Information", "% Processor Time"); 
     var cat = new PerformanceCounterCategory("Processor Information"); 
     var instances = cat.GetInstanceNames(); 
     var cs = new Dictionary<string, CounterSample>(); 

     foreach (var s in instances) 
     { 
      pc.InstanceName = s; 
      cs.Add(s, pc.NextSample()); 
     } 

     while (true) 
     { 
      foreach (var s in instances) 
      { 
       pc.InstanceName = s; 
       Console.WriteLine("{0} - {1:f}", s, Calculate(cs[s], pc.NextSample())); 
       cs[s] = pc.NextSample(); 
      } 
      System.Threading.Thread.Sleep(500); 
     } 
    } 

la chose importante est que vous ne pouvez pas compter sur le calcul .net natif pour 100nsInverse compteurs de performance (rendement seulement 0 ou 100 pour moi ... bug?), mais vous devez calculer vous-même et que vous avez besoin d'une archive des derniers CounterSamples pour chaque instance (les instances représentent un cœur ou une somme de ces cœurs).

Il semble y avoir un Convetion de nommage pour les instances:

0,0 - premier cpu premier noyau 0,1 - premier cpu second noyau 0, _Total - charge totale de la première cpu _Total - Total charge de tous les CPUs

(non vérifié - recommanderait de ne pas compter sur elle jusqu'à nouvel enquête fait) ...

0

Depuis noyaux apparaissent comme séparés processeurs au système d'exploitation, vous utilisez le même code que vous souhaitez utiliser pour déterminer la charge par CPU dans une machine multiprocesseur. Un tel exemple (en C) est here. Notez qu'il utilise WMI, de sorte que l'autre thread lié dans les commentaires ci-dessus vous a probablement le plus de chemin.