using System; using System.Runtime.InteropServices; namespace Kackman.Framework.Diagnostics { /// <summary> /// A timer that uses the windows tick count /// </summary> public sealed class TickCountTimer : Timer { private double m_fLastElapsedTime; private double m_fBaseTime; private double m_fStopTime; private bool m_bTimerStopped; [System.Security.SuppressUnmanagedCodeSecurity] // We won't use this maliciously [DllImport("winmm.dll")] private static extern int timeGetTime(); /// <summary> /// Creates a new instance of the class /// </summary> public TickCountTimer() { } /// <summary> /// <see cref="Timer.Start"/> /// </summary> public override void Start() { double time = GetTime(); if (m_bTimerStopped) m_fBaseTime += time - m_fStopTime; m_fStopTime = 0.0; m_fLastElapsedTime = time; m_bTimerStopped = false; } /// <summary> /// <see cref="Timer.Reset"/> /// </summary> public override void Reset() { double time = GetTime(); m_fBaseTime = time; m_fLastElapsedTime = time; m_fStopTime = 0; m_bTimerStopped = false; } /// <summary> /// <see cref="Timer.Stop"/> /// </summary> public override void Stop() { if (!m_bTimerStopped) { double time = GetTime(); m_fStopTime = time; m_fLastElapsedTime = time; m_bTimerStopped = true; } } /// <summary> /// <see cref="Timer.Advance"/> /// </summary> public override void Advance() { m_fStopTime += 0.1; } /// <summary> /// <see cref="Timer.AbsoluteTime"/> /// </summary> public override double AbsoluteTime { get { return GetTime(); } } /// <summary> /// <see cref="Timer.ElapsedTime"/> /// </summary> public override double ElapsedTime { get { double time = GetTime(); double fElapsedTime = time - m_fLastElapsedTime; m_fLastElapsedTime = time; return fElapsedTime; } } /// <summary> /// <see cref="Timer.ApplicationTime"/> /// </summary> public override double ApplicationTime { get { return GetTime() - m_fBaseTime; } } private double GetTime() { if (m_fStopTime != 0.0) return m_fStopTime; return timeGetTime() * 0.001; } } }
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
10 PRINT "Don is cool" 20 GOTO 10