C# - Számláló készítése a Performance Monitor alá

forráskód letöltése
A Performance Monitor egy olyan segédeszköz a Windows-ban, melynek segítségével többféle tulajdonságot, eseményt mérhetünk a rendszerünkben. Ilyen lehet például a processzor aktuális leterheltsége, vagy a memóriával kapcsolatos információk és még számtalan egyéb objektum.
Ha saját alkalmazásunk olyan tevékenységet folytat, melyhez jó lenne egy ilyen számlálót közzé tenni, amelynek változása a Performance Monitor segítségével követhető lenne, akkor a mellékelt példából megtudhatjuk ennek módját.
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.
        ccdc.Add(ccd);
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.
      timer1.Enabled = true;
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);
    }