PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c#] Auslastung der Prozessorkerne ermittleln



!sniper
23.07.2010, 21:38
HI,

ich würde gerne die Auslastung jedes Kernes(z.B. bei nem Dualcore) ermitteln.
Wie geht das denn unter C#?

AgainsT
24.07.2010, 02:11
Hi,
ich hab da nen ungetesteten Snippet:

public uint CPUSpeed()
{
ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
uint sp = (uint)(Mo["CurrentClockSpeed"]);
Mo.Dispose();
return sp;
}


Ich hätte mal versucht Win32_Processor.DeviceID='CPU0' in CPU1, CPU2 und CPU3 in nem Try-Catch Block zu selecten...
Bitte gib nen kurzes Feedback ob das klappt ;)

!sniper
24.07.2010, 08:12
Ohne dir zu nahe zu treten zu wollen, aber vlt. lags auch an meiner Beschreibung... aber was dein Snippet macht ist die "Geschwindigkeit" auszugeben und das hast nicht immer was mit der Auslastung zu tun.
Was ich zur Auslastung gefunden habe ist das(Was aber nicht für alle Kerne spricht scheinbar):
C# - CPU Auslastung ermitteln (http://dotnet-snippets.de/dns/cpu-auslastung-ermitteln-SID100.aspx)

edit:
Wer lesen kann ist besser dran ;)
Bitte closen habs gefunden^^

AgainsT
24.07.2010, 11:26
Ja sry mein Fehler...
Für alle anderen:
C# - CPU Last von mehreren CPUs überwachen (http://dotnet-snippets.de/dns/c-cpu-last-von-mehreren-cpus-ueberwachen-SID372.aspx)

!sniper
24.07.2010, 16:41
Hab das ganze jetzt mal versucht umzusetzen:


private void InitialisierePerformanceCounter(int cores) // Initialisieren
{
cpuCounter = new PerformanceCounter[cores];

int i = 0;
while (i < cores)
{
cpuCounter[i] = new PerformanceCounter();
cpuCounter[i].CategoryName = "Processor";
cpuCounter[i].CounterName = "% Processor Time";
cpuCounter[i].InstanceName = i.ToString();
i++;
}

}

private float GetCPUusage(int core) // Liefert die aktuelle Auslastung zurück
{
return cpuCounter[core].NextValue();
}


Dann die Progressbaren:



//Timertick
ProgressBar[] prog = new ProgressBar[8];
prog[0] = progressBar1;
prog[1] = progressBar2;
prog[2] = progressBar3;
prog[3] = progressBar4;

int i = 0;
while(i < timeranz){//timeranz = 4(kommt aus einem anderen Codeteil, deswegen reicht es wenn man weiß Wert ? 4 ;)

InitialisierePerformanceCounter(timeranz);
prog[i].Value = Convert.ToInt32(GetCPUusage(i));
listBox1.Items.Add(GetCPUusage(i).ToString());
prog[i].Update();
i++;
}

Hab momentan nur 4 Kerne deswegen auch nur 4Progressbar's ;)
Weiß jemand wo der Fehler liegen könnte, warum die Progressbar's ständig einen Wert von 0 anzeigen(ebenso die Listbox, die ich eingebaut habe um zu sehen ob es nicht doch an den Progressbar's liegt)

Hab die CPUcounter noch mal manuell initialisiert, auch kein Erfolg.
Komisch war als ich das Ergebnis in einer Messagebox mit ausgegeben habe, also das hier:
private float GetCPUusage(int core) // Liefert die aktuelle Auslastung zurück
{
MessageBox.Show(
cpuCounter[core].NextValue().toString());
return cpuCounter[core].NextValue();
}

Da haben sich die Werte in der Progressbar verändert, aber fragt jetzt nicht wie...
Ka, glaube aber auch das die Werte falsch waren.
Stimmt vlt. an der cpucounter Syntax was nicht?