
A mellékelt példa használatához szükséges a CounterComponentLibrary projekt lefordítása és az ebben található CounterComponent komponens felvétele a ToolBox-ra.
Ez a hardver elem számítógépenként már és más sebességgel számlálhatja az eltelt időt. Így mielőtt felhasználnánk az általa szolgáltatott értéket előbb meg kell tudnunk, hogy egy másodperc alatt hány számlálás történik. Nyilvánvaló, hogy ha ez az érték minél nagyobb, annál pontosabban történik az idő mérése.
Ennek lekérdezését a QueryPerformanceFrequency Windows függvény segítségével tehetjük meg. Paraméterként egy 64 bites egész számot tárolni képes változót kell átadnunk. Ha a függvény visszatérési értéke igaz, akkor sikeresen megtörtént a lekérdezés, hamis érték esetén az adott számítógép nem támogatja hardveresen ezt a funkciót. Ilyen géppel manapság viszont már nem igen találkozhatunk.
A számláló aktuális értékét a QueryPerformanceCounter Windows függvénnyel kérdezhetjük le. Paraméterként ez is egy 64 bites változót vár.
Készítsünk egy osztályt e két függvény használatához. Mindkét függvény a Kernel32.dll-ben található, így csak hivatkoznunk kell rájuk.
public class Win32
{
[System.Runtime.InteropServices.DllImport("KERNEL32")]
public static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);
[System.Runtime.InteropServices.DllImport("KERNEL32")]
public static extern bool QueryPerformanceFrequency(ref long lpFrequency);
}
Szükség lesz még egy változóra is, mely tárolja a számláló aktuális értékét.
A Start függvénynél csak annyi a teendőnk, hogy lekérdezzük e számláló aktuális értékét és tároljuk a változónkban.
public void Start()
{
Win32.QueryPerformanceCounter(ref start);
}
Amikor az időmérést szeretnénk befejezni, akkor kell meghívni a Stop függvényt. Ekkor ismét lekérdezzük a számláló értékét, melyet most a stop nevű változóba tárolunk.
public float Stop()
{
long stop = 0;
Win32.QueryPerformanceCounter(ref stop);
Az eredmény kiszámításához szükségünk lesz az időmérő frekvenciájára is, melynek értéke a freq változóba kerül.
long freq = 0;
Win32.QueryPerformanceFrequency(ref freq);
E három változó értékének ismeretében már könnyedén kiszámítható az eltelt idő a Start és a Stop függvény meghívása között.
return ((float)(stop-start)/(float)freq);
}
A számlálót kiválóan felhasználhatjuk arra, hogy egy-egy programrészlet futási idejét lemérjük vele, de könnyen készíthetünk időzítőt is ez alapján.
private void button1_Click(object sender, System.EventArgs e)
{
counterComponent1.Start();
for (int i=0; i<10000000; i++)
{
}
label1.Text = counterComponent1.Stop().ToString() + " sec";
}