提供一个获取高精度时间类

如果你觉得用 DotNet 自带的 DateTime 获取的时间精度不够,解决的方法是通过调用 QueryPerformanceFrequency 和 QueryPerformanceCounter这两个API来实现。
        /// <summary>
        
/// 获取时间的精度
        
/// </summary>
        
/// <param name="PerformanceFrequency"></param>
        
/// <returns></returns>
        [SuppressUnmanagedCodeSecurity]
        [DllImport(
"kernel32")]
        
static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);
        
/// <summary>
        
/// 获取时间计数
        
/// </summary>
        
/// <param name="PerformanceCount"></param>
        
/// <returns></returns>
        [SuppressUnmanagedCodeSecurity]
        [DllImport(
"kernel32")]
        
static private extern bool QueryPerformanceCounter(ref long PerformanceCount);

下面是完整的封装代码:
    /// <summary>
    
/// 定义一个高精度的时间类
    
/// </summary>
    public class Timer
    {
        
#region private members
        
private long ticksPerSecond = 0;
        
private long elapsedTime = 0;
        
private long baseTime = 0;
        
#endregion

        
#region windows API
        
/// <summary>
        
/// 获取时间的精度
        
/// </summary>
        
/// <param name="PerformanceFrequency"></param>
        
/// <returns></returns>
        [SuppressUnmanagedCodeSecurity]
        [DllImport(
"kernel32")]
        
static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);
        
/// <summary>
        
/// 获取时间计数
        
/// </summary>
        
/// <param name="PerformanceCount"></param>
        
/// <returns></returns>
        [SuppressUnmanagedCodeSecurity]
        [DllImport(
"kernel32")]
        
static private extern bool QueryPerformanceCounter(ref long PerformanceCount);
        
#endregion

        
#region constructors
        
/// <summary>
        
/// new
        
/// </summary>
        public Timer()
        {
            
// Use QueryPerformanceFrequency to get frequency of the timer
            if (!QueryPerformanceFrequency(ref ticksPerSecond))
                
throw new ApplicationException("Timer: Performance Frequency Unavailable");
            Reset();
        }
        
#endregion

        
#region public methods
        
/// <summary>
        
/// 重置时间相关计数器
        
/// </summary>
        public void Reset()
        {
            
long time = 0;
            QueryPerformanceCounter(
ref time);
            baseTime 
= time;
            elapsedTime 
= 0;
        }
        
/// <summary>
        
/// 获取当前与最近一次 reset 时间差
        
/// </summary>
        
/// <returns>The time since last reset.</returns>
        public double GetTime()
        {
            
long time = 0;
            QueryPerformanceCounter(
ref time);
            
return (double)(time - baseTime) / (double)ticksPerSecond;
        }
        
/// <summary>
        
/// 获取当前系统的时间 ticks 数
        
/// </summary>
        
/// <returns>The current time in seconds.</returns>
        public double GetAbsoluteTime()
        {
            
long time = 0;
            QueryPerformanceCounter(
ref time);
            
return (double)time / (double)ticksPerSecond;
        }
        
/// <summary>
        
/// 获取此次与上次调用此方法的两次时间差
        
/// </summary>
        
/// <returns>The number of seconds since last call of this function.</returns>
        public double GetElapsedTime()
        {
            
long time = 0;
            QueryPerformanceCounter(
ref time);
            
double absoluteTime = (double)(time - elapsedTime) / (double)ticksPerSecond;
            elapsedTime 
= time;
            
return absoluteTime;
        }
        
#endregion
    }

调用代码:
            Timer t = new Timer();
            t.GetAbsoluteTime();
            t.GetElapsedTime();
            t.Reset();
            t.GetTime();

需要的朋友可以从此处下载。

posted @ 2007-11-10 21:18 t-mac.NET 阅读(347) 评论(0)  编辑 收藏 所属分类: C#