Hardware/CPU/IntelCPU.cs
changeset 24 09ab31bee6bd
parent 23 1662dea7a261
child 25 ff3e6edc7113
     1.1 --- a/Hardware/CPU/IntelCPU.cs	Wed Feb 03 18:10:11 2010 +0000
     1.2 +++ b/Hardware/CPU/IntelCPU.cs	Wed Feb 03 20:35:10 2010 +0000
     1.3 @@ -38,6 +38,7 @@
     1.4  using System;
     1.5  using System.Collections.Generic;
     1.6  using System.Drawing;
     1.7 +using System.Diagnostics;
     1.8  using System.Reflection;
     1.9  using System.Text;
    1.10  
    1.11 @@ -48,12 +49,19 @@
    1.12      private Image icon;
    1.13  
    1.14      private Sensor[] coreTemperatures;
    1.15 +    private Sensor totalLoad;
    1.16 +    private Sensor[] coreLoads;
    1.17 +
    1.18 +    private List<ISensor> active = new List<ISensor>();
    1.19  
    1.20      private float tjMax = 0;
    1.21      private uint logicalProcessors;
    1.22      private uint logicalProcessorsPerCore;
    1.23      private uint coreCount;
    1.24  
    1.25 +    private PerformanceCounter totalLoadCounter;
    1.26 +    private PerformanceCounter[] coreLoadCounters;
    1.27 +
    1.28      private const uint IA32_THERM_STATUS_MSR = 0x019C;
    1.29      private const uint IA32_TEMPERATURE_TARGET = 0x01A2;
    1.30  
    1.31 @@ -125,11 +133,29 @@
    1.32          default: tjMax = 100; break;
    1.33        }
    1.34  
    1.35 +      totalLoadCounter = new PerformanceCounter();
    1.36 +      totalLoadCounter.CategoryName = "Processor";
    1.37 +      totalLoadCounter.CounterName = "% Processor Time";
    1.38 +      totalLoadCounter.InstanceName = "_Total";
    1.39 +      totalLoad = new Sensor("CPU Total", 0, SensorType.Load, this);
    1.40 +
    1.41 +      coreLoadCounters = new PerformanceCounter[
    1.42 +        coreCount * logicalProcessorsPerCore];
    1.43 +      for (int i = 0; i < coreLoadCounters.Length; i++) {
    1.44 +        coreLoadCounters[i] = new PerformanceCounter();
    1.45 +        coreLoadCounters[i].CategoryName = "Processor";
    1.46 +        coreLoadCounters[i].CounterName = "% Processor Time";
    1.47 +        coreLoadCounters[i].InstanceName = i.ToString();
    1.48 +      }
    1.49 +
    1.50        coreTemperatures = new Sensor[coreCount];
    1.51 -      for (int i = 0; i < coreTemperatures.Length; i++)
    1.52 -        coreTemperatures[i] =
    1.53 -          new Sensor("Core #" + (i + 1), i, tjMax, SensorType.Temperature, 
    1.54 -            this);
    1.55 +      coreLoads = new Sensor[coreCount];
    1.56 +      for (int i = 0; i < coreTemperatures.Length; i++) {
    1.57 +        coreTemperatures[i] = new Sensor("Core #" + (i + 1), i, tjMax,
    1.58 +          SensorType.Temperature, this);
    1.59 +        coreLoads[i] = new Sensor("Core #" + (i + 1), i + 1, 
    1.60 +          SensorType.Load, this);
    1.61 +      }
    1.62  
    1.63        Update();                   
    1.64      }
    1.65 @@ -147,9 +173,7 @@
    1.66      }
    1.67  
    1.68      public ISensor[] Sensors {
    1.69 -      get {
    1.70 -        return coreTemperatures;
    1.71 -      }
    1.72 +      get { return active.ToArray(); }
    1.73      }
    1.74  
    1.75      public string GetReport() {
    1.76 @@ -180,14 +204,44 @@
    1.77            if ((eax & 0x80000000) != 0) {
    1.78              // get the dist from tjMax from bits 22:16
    1.79              coreTemperatures[i].Value = tjMax - ((eax & 0x007F0000) >> 16);
    1.80 +            ActivateSensor(coreTemperatures[i]);
    1.81 +          } else {
    1.82 +            DeactivateSensor(coreTemperatures[i]);
    1.83            }
    1.84          }        
    1.85 -      }  
    1.86 +      }
    1.87 +
    1.88 +      totalLoad.Value = totalLoadCounter.NextValue();
    1.89 +      ActivateSensor(totalLoad);
    1.90 +
    1.91 +      for (int i = 0; i < coreLoads.Length; i++) {
    1.92 +        float value = 0;
    1.93 +        for (int j = 0; j < logicalProcessorsPerCore; j++)
    1.94 +          value += coreLoadCounters[
    1.95 +            logicalProcessorsPerCore * i + j].NextValue();
    1.96 +        value /= logicalProcessorsPerCore;
    1.97 +        coreLoads[i].Value = value;
    1.98 +        ActivateSensor(coreLoads[i]);
    1.99 +      }
   1.100      }
   1.101  
   1.102 -    #pragma warning disable 67
   1.103 +    private void ActivateSensor(Sensor sensor) {
   1.104 +      if (!active.Contains(sensor)) {
   1.105 +        active.Add(sensor);
   1.106 +        if (SensorAdded != null)
   1.107 +          SensorAdded(sensor);
   1.108 +      }
   1.109 +    }
   1.110 +
   1.111 +    private void DeactivateSensor(Sensor sensor) {
   1.112 +      if (active.Contains(sensor)) {
   1.113 +        active.Remove(sensor);
   1.114 +        if (SensorRemoved != null)
   1.115 +          SensorRemoved(sensor);
   1.116 +      }
   1.117 +    }
   1.118 +
   1.119      public event SensorEventHandler SensorAdded;
   1.120      public event SensorEventHandler SensorRemoved;
   1.121 -    #pragma warning restore 67
   1.122    }
   1.123  }