电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2020/11/16
 

如果你觉得用 DotNet 自带的 DateTime 获取的时间精度不够解决的方法是通过调用 QueryPerformanceFrequency 和 QueryPerformanceCounter这两个API来实现

/// <summary>

/// 获取时间的精度

/// </summary>

/// <param name=PerformanceFrequency></param>

/// <returns></returns>

[SuppressUnmanagedCodeSecurity]

[DllImport(kernel)]

static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);

/// <summary>

/// 获取时间计数

/// </summary>

/// <param name=PerformanceCount></param>

/// <returns></returns>

[SuppressUnmanagedCodeSecurity]

[DllImport(kernel)]

static private extern bool QueryPerformanceCounter(ref long PerformanceCount);

下面是完整的封装代码

/// <summary>

/// 定义一个高精度的时间类

/// </summary>

public class Timer

{

#region private members

private long ticksPerSecond = ;

private long elapsedTime = ;

private long baseTime = ;

#endregion

#region windows API

/// <summary>

/// 获取时间的精度

/// </summary>

/// <param name=PerformanceFrequency></param>

/// <returns></returns>

[SuppressUnmanagedCodeSecurity]

[DllImport(kernel)]

static private extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);

/// <summary>

/// 获取时间计数

/// </summary>

/// <param name=PerformanceCount></param>

/// <returns></returns>

[SuppressUnmanagedCodeSecurity]

[DllImport(kernel)]

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 = ;

QueryPerformanceCounter(ref time);

baseTime = time;

elapsedTime = ;

}

/// <summary>

/// 获取当前与最近一次 reset 时间差

/// </summary>

/// <returns>The time since last reset</returns>

public double GetTime()

{

long time = ;

QueryPerformanceCounter(ref time);

return (double)(time baseTime) / (double)ticksPerSecond;

}

/// <summary>

/// 获取当前系统的时间 ticks 数

/// </summary>

/// <returns>The current time in seconds</returns>

public double GetAbsoluteTime()

{

long time = ;

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 = ;

QueryPerformanceCounter(ref time);

double absoluteTime = (double)(time elapsedTime) / (double)ticksPerSecond;

elapsedTime = time;

return absoluteTime;

}

#endregion

}

调用代码

Timer t = new Timer();

tGetAbsoluteTime();

tGetElapsedTime();

tReset();

tGetTime();

上一篇:在vb中实现超连接的方法!和直接发邮件

下一篇:上传视频并将各种视频文件转换成.flv格式