2013-11-03 44 views
9

Bir işlemin CPU kullanımının izlenmesi için PerformanceCounter sınıfının kullanılmasını engellemeye çalışıyorum çünkü işlem sayımı oldukça yüksek olduğunda (düzgün bir şekilde) birçok işlem).Process.TotalProcessorTime tarafından işlem cpu kullanımı hesaplanıyor

İlk yaklaşımım, Win32_PerfFormattedData_PerfOS_Processor sınıfını ve PercentProcessorTime özelliğini kullanarak WMI yolunu kullanmaktı, ancak birden çok çekirdek üzerinden CPU kullanımını hesaplamaya çalışırken bir sorun var gibi görünüyor (döndürdüğü maksimum değer% 100 imkansız kılıyor CPU çekirdeği sayımına göre bölmek, yanlış sonuçlara neden olmak).

Sonunda, Process'in sınıfının TotalProcessorTime özelliğini kullanmaya karar verdim. Ne yazık ki, Sürecin kullandığı toplam CPU kullanımının yüzdesini nasıl hesaplayacağından emin değilim. İşlemcinin belirli bir süre içinde ne kadar süre harcadığını öğrenmek için mevcut PercentProcessorTime değerini önceki bir PercentProcessorTime değerinden çıkarmam gerektiğini biliyorum, ancak oradan nasıl devam edeceğime emin değilim.

Şimdiden teşekkürler.

cevap

16
class GetCPUUsage 
{ 
    static TimeSpan start; 
    public static double CPUUsageTotal 
    { 
     get; 
     private set; 
    } 

    public static double CPUUsageLastMinute 
    { 
     get; 
     private set; 
    } 

    static TimeSpan oldCPUTime = new TimeSpan(0); 
    static DateTime lastMonitorTime = DateTime.UtcNow; 
    public static DateTime StartTime = DateTime.UtcNow; 
    // Call it once everything is ready 
    static void OnStartup() 
    { 
     start = Process.GetCurrentProcess().TotalProcessorTime; 
    } 

    // Call this every 30 seconds 
    static void CallCPU() 
    { 
     TimeSpan newCPUTime = Process.GetCurrentProcess().TotalProcessorTime - start; 
     CPUUsageLastMinute = (newCPUTime - oldCPUTime).TotalSeconds/(Environment.ProcessorCount * DateTime.UtcNow.Subtract(lastMonitorTime).TotalSeconds); 
     lastMonitorTime = DateTime.UtcNow; 
     CPUUsageTotal = newCPUTime.TotalSeconds/(Environment.ProcessorCount * DateTime.UtcNow.Subtract(StartTime).TotalSeconds); 
     oldCPUTime = newCPUTime; 
    } 
} 

class GetCPUInfo 
{ 
    public static string GetInfoMinute() 
    { 
     return String.Format("{0:0.0}", GetCPUUsage.CPUUsageLastMinute * 100); 
    } 

    public static string GetInfoTotal() 
    { 
     return String.Format("{0:0.0}", GetCPUUsage.CPUUsageTotal * 100); 
    } 
} 
+0

Test örneğini de sağlayabilir misiniz? – Demodave

+0

Daha az kesir kaybı için TimeStamp.TotalSeconds yerine TimeStamp.Ticks kullanın – Jan

İlgili konular