c# - beckdorf - heins haustechnik hitzacker




CPU-Auslastung steuern (2)

Der einfachste Weg wäre, Ihre Hauptschleife so zu modifizieren, dass Sie entweder auf die Eingabe warten - das klassische ereignisgesteuerte Modell - oder periodisch für eine kurze Zeit zu schlafen.

Wenn ich die Anwendung in den Ruhezustand versetzen würde, würde ich nur eine sehr kurze Zeitüberschreitung verwenden, irgendwo im Bereich von 10-100 ms, und einige Benutzereingaben würden sich verzögern, und weniger würde mehr OS-Overhead beim Umschalten Ihrer Anwendung mit sich bringen.

Wie ist es ratsam, die CPU-Auslastung während der Laufzeit zu steuern?

Abfragen der CPU-Last und Einfügen von Schlaf?


Ich würde OS-Funktionalität empfehlen. Dafür gibt es unter Windows Leistungsindikatoren und WinAPI-Funktionen.

Hier ein Beispiel mit Leistungsindikatoren von BCL Team Blog :

foreach (Process proc in Process.GetProcesses()) {
    using (PerformanceCounter pcProcess = new PerformanceCounter("Process", "% Processor Time", proc.ProcessName)) {
        pcProcess.NextValue();
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine("Process:{0} CPU% {1}", proc.ProcessName, pcProcess.NextValue());   
    }
}

Dieser Code macht dasselbe mit WMI von CodeProject :

public string GetCPU()
{
    decimal PercentProcessorTime=0;
    mObject_CPU.Get();

    ulong  u_newCPU   = 
      (ulong)mObject_CPU.Properties["PercentProcessorTime"].Value;
    ulong u_newNano   = 
      (ulong)mObject_CPU.Properties["TimeStamp_Sys100NS"].Value;
    decimal d_newCPU  = Convert.ToDecimal(u_newCPU);
    decimal d_newNano = Convert.ToDecimal(u_newNano);
    decimal d_oldCPU  = Convert.ToDecimal(u_oldCPU);
    decimal d_oldNano = Convert.ToDecimal(u_oldNano);

    // Thanks to MSDN for giving me this formula !

    PercentProcessorTime = 
      (1 - ((d_newCPU-d_oldCPU)/(d_newNano - d_oldNano)))*100m;

    // Save the values for the next run

    u_oldCPU          = u_newCPU;
    u_oldNano         = u_newNano;

    return PercentProcessorTime.ToString("N",nfi);;
}

So können Sie diese OS-Provider (oder andere für Ihr Betriebssystem) abfragen und Ihren Thread unterbringen, wenn die Prozessorauslastung hoch ist.