A megvalósításhoz természetesen most is találunk egy osztályt, PerformanceCounter névvel, mely segítségünkre lesz. Saját számlálónk létrehozásához kell annak egy nevet adnunk. Ez a név jelenik meg a Performance Montior hozzáadás ablakának Performance Object legördíthető listájában. Mellékelt programban ezt a nevet a SoftwareOnline-ra választottuk.
Mielőtt létrehoznánk ezt a számlálót, ellenőriznünk kell, hogy nem létezik-e már. Ezt legegyszerűbben a PerformanceCounterCategory osztály statikus Exists függvényével tudjuk megtenni. Paraméterként a kérdéses objektum nevet kell átadni.
private string FObjectName = "SoftwareOnline";
if (!PerformanceCounterCategory.Exists(FObjectName))
{
Abban az esetben, ha még nincs, akkor létre kell hoznunk azt. Ehhez szükségünk lesz a CounterCreationData osztály egy példányára.
CounterCreationData ccd = new CounterCreationData();
Ebben az osztályban tudjuk leírni, hogy milyen számlálót szeretnénk létrehozni. A CounterName property-ben adhatjuk meg a nevét.
ccd.CounterName = FCounterName;
A CounterType property-ben a számláló típusa adható meg, mely igen sokféle lehet. Ha például a RateOfCountsPerSecond32 típust választjuk, akkor számlálónk a következőképpen működik: a Performance Monitor által megjelenített aktuális érték attól fog függni, hogy alkalmazásunk egy másodperc alatt hányszor növelte a számláló értékét. Ha tehát minél nagyobb ütemben növeljük ezt a számlálót, annál magasabb értéket kapunk a Performance Monitor-ban.
ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond32;
A számlálónkhoz megadható egy magyarázó szöveg is a CounterHelp property-ben. Ez akkor lesz látható a felhasználó számára, ha a Performance Monitor Add Counters ablakában az Explain gombra kattint.
ccd.CounterHelp = "Számláló leírása";
Egy-egy objektum több számlálót is tartalmazhat, gondoljunk csak a processzor objektumra, hiszen ott is számos különféle értéket mérhetünk. Így saját programunk is több számlálót hozhatna létre, melyek tárolásához egy kollekcióra, vagyis a CounterCreationDataCollection osztályra van szükségünk.
CounterCreationDataCollection ccdc = new CounterCreationDataCollection();
Mivel most csak egy számlálót hozunk létre, így csupán ezt az egy objektumot kell átadnunk a kollekció számára.
E lépésre csupán azért volt szükségünk, mert új számláló létrehozásához a számláló objektumokat CounterCreationDataCollection típusban kell átadnunk a PerformanceCounterCategory osztály Create függvénye számára.
PerformanceCounterCategory.Create(FObjectName, "", ccdc);
}
Ezek után létrehozhatjuk a PerformanceCounter objektumunkat, hogy kapcsolatot tudjunk tartani számlálónkkal, vagyis növelni annak értékét. A konstruktorban az első paraméter az objektum neve a megadandó, majd a számláló neve és végül a példány neve, melyhez kapcsolódni szeretnénk. Végső, logikai típusú paraméterünkben arról rendelkezhetünk, hogy a megnyitott kapcsolat csak olvasható-e vagy sem.
FCounter = new PerformanceCounter(FObjectName, FCounterName, FInstanceName, false);
Számlálónk növeléséhez egy Timer komponenst használunk fel. A mellékelt példában egy TrackBar vezérlő segítségével változtathatjuk a Timer intervallumát és így ezzel a számlálónk növelésének gyakoriságát is. Most, hogy már létrehoztuk az új számlálót, indíthatjuk a Timer-t.
Amikor tehát bekövetkezik a Timer Tick eseménye, akkor nincs más teendőnk, mint növelni a számlálónk értékét. Ehhez a PerformanceCounter Increment függvényét kell meghívnunk.
private void timer1_Tick(object sender, System.EventArgs e)
{
FCounter.Increment();
}
Minél gyakrabban jön létre a Tick esemény, annál többször növeljük a számláló értékét egy másodpercen belül, így annál magasabb lesz a Performance Monitor-ban a megjelenített érték.
private void trackBar1_ValueChanged(object sender, System.EventArgs e)
{
timer1.Interval = 100 - trackBar1.Value;
}
Mielőtt programunk futása véget ér, célszerű megszüntetnünk a létrehozott számlálót. Ehhez a PerformanceCounterCategory osztály statikus Delete függvényét használhatjuk, melynek paraméterként a törlendő objektum nevét kell megadni.
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
PerformanceCounterCategory.Delete(FObjectName);
}