Laden...

kleine Tray-Applikation um Prozessorauslastung zu ermitteln

Erstellt von Locutus vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.936 Views
Locutus Themenstarter:in
68 Beiträge seit 2008
vor 13 Jahren
kleine Tray-Applikation um Prozessorauslastung zu ermitteln

Hallo zusammen,

ich möchte hier eine kleine Tray-Applikation vorstellen, welche die Prozessorauslastung ermittelt.
Entstanden ist das Projekt in Verbindung mit meinem Basteltrieb. Ich bin Elektroniker und programmiere hauptsächlich Mikrocontroller in Assembler und C, wollte aber auch mal Elektronik mit PC-Software verknüpfen.

Hier die wichtigsten Daten:

  • Tray-Applikation
  • Ermittelt die Anzahl der physikalisch installierten CPUs, der physikalischen Kerne einer CPU und der logischen CPUs (eine Kern, dessen Hyperthreading-Funktion aktiviert ist, resultiert in zwei logischen CPUs) mittels WMI
  • Ermittelt die Auslastung der logischen CPUs mittels PerformanceCounter-Klasse und stellt ein Event zur Verfügung, wenn neue Auslastungsdaten vorhanden sind.

Kurzbeschreibung der einzelnen Bestandteile:

Das Icon der Applikation ist in den Assembly-Ressourcen integriert, muss also nicht als separate Datei mit dabei sein. Ein Wechsel des Icons zur Laufzeit ist möglich.
Für die Iconerstellung gibts z.B. folgende Tools:
IcoFX
Greenfish Icon Editor

Die Applikation kann nicht mehrmals gleichzeitig aufgerufen werden, was ich mittels Mutex gelöst habe:
Mehrfachen Start der Anwendung verhindern
GUID der Application auslesen?
Programm nicht mehrmals starten (.Net)
mehrere Programminstanzen verhindern?
Zu sehen in der Klasse "ApplicationTools" in der gleichnamigen CS-Datei.

Die Ermittlung der Anzahl und Auslastung der CPUs/Kerne ist in der Klasse "CPU" der gleichnamigen CS-Datei zu sehen. Die Klasse ist als Singleton implementiert, es kann also nur eine Instanz der Klasse erzeugt werden. Eine Lösung als statische Klasse war eigentlich angedacht, hat sich aber mit dem klasseninternen Timer gebissen (muss ich noch untersuchen).
Für die Ermittlung der Anzahl habe ich WMI verwendet, wofür der "WMI Code Creator" ein nützliches Tool war:
WMI Code Creator
Man wählt den Namespace, die Klasse und das gewünschte Property und kann sich C# kompatiblen Code generieren lassen. Achtung: Man muss im Menü "Code Language" auf C# umschalten.
Wichtig: Der generierte Code fragt alle Properties der gewünschten Klasse ab. Um die Performance zu erhöhen, sollte man nur das gewünschte Property abfragen:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");

ersetzen durch beispielsweise:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT NumberOfCores FROM Win32_Processor");

Die Auslastung habe ich mittels PerformanceCounter-Klasse gelöst. Hier ist zu beachten, dass man für das Auslesen der PerformanceCounter Admin-Rechte braucht. Mittels WMI kann man wohl nur die Auslastung der physikalischen CPU ermitteln.
Um die Daten zugänglich zu machen, löst die Klasse jede Sekunde ein selbstdefiniertes Ereignis aus (PerformanceCounter sollten in Intervallen von min. 1 sec ausgelesen werden), dessen Ereignisparameter ein Array der jeweiligen Auslastungwerte ist. Das erste Element entspricht der Gesamtauslastung, alle weiteren der Auslastung der logischen CPUs.
Bei PerformanceCountern sind die Namen und Kategorien abhängig von der Sprache der Windowsversion. Wer wissen will, welche Namen und Kategorien auf seinem System vorhanden sind, nimmt dieses Tool:
PerformanceCounter Enumerator

Die Erstellung des selbstdefinierten Ereignisses basiert auf folgenden Beiträgen:
[FAQ] Eigenen Event definieren / Information zu Events
Problem mit EventHandler
Event und Übergabeparameter
Eigenes Event Argument
Frage zu Event / EventArgs

Angehängt habe ich eine Demoversion, bei das Ereignis einen BallonTip erzeugt, der die Auslastung anzeigt.

Auf Anregungen und Kritik freue ich mich.

Viel Spass.

Locutus

====================================
1001011010101010101101110101111000101010101010
Ich assimilier dich...
Und dich auch...
Ich mein's ernst!

Locutus Themenstarter:in
68 Beiträge seit 2008
vor 13 Jahren

Und hier noch ein Bild, wie das in Verbindung mit meiner gebastelten Hardware aussieht. Leider konnte ich kein Bild schiessen, bei die LEDs nicht so ausstrahlen, aber ich hoffe, man erkennt trotzdem was.

Locutus

====================================
1001011010101010101101110101111000101010101010
Ich assimilier dich...
Und dich auch...
Ich mein's ernst!

B
293 Beiträge seit 2008
vor 13 Jahren

Vielen Dank für deinen Beitrag.
Ich habe mir deinen Code jetzt noch nicht genauer angeschaut. Mich würde jedoch besonders interessieren, wie du die Hardware ansteuerst.
Ich wollte sowas auch mal machen, habe es aber nur über den LPT-Port umgesetzt bekommen, was leider mehr als altertümlich ist.
Wie kommunizierst du mit der Hardware und aus was für Teilen setzt sich deine Anzeige überhaupt zusammen?

Ich freue mich über jede Antwort. 😉

viele Grüße,
Raffi

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

Locutus Themenstarter:in
68 Beiträge seit 2008
vor 13 Jahren

Hi Raffi,

die Hardware der Version 1 ist nichts großartiges, ein FT232R (USB-Seriell-Wandler), der per DLL auch als 8+4 Bit IO-Chip verwendet werden kann, plus vier Logik-Latches 74HC(T)574 für 4x 8 LEDs und ein Feldeffekttransistor für das korrekte USB-Power-Management.

Version 2 soll dann bereits ein USB-Microcontroller sein, mit PWM-gesteuerten RGB LEDs (PWM für Helligkeit).

Locutus

====================================
1001011010101010101101110101111000101010101010
Ich assimilier dich...
Und dich auch...
Ich mein's ernst!