Dev.Hong
将欲取之 必先予之……
随笔- 53  文章- 0  评论- 220 
博客园  首页  新随笔  联系  管理  订阅 订阅
提供一个获取高精度时间类
如果你觉得用 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 on 2007-11-10 21:18 Dev.Hong 阅读(505) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
程序员问答社区,解决您的IT难题
博客园首页博问新闻闪存程序员招聘知识库
Copyright ©2012 Dev.Hong