您的位置:首页 > 产品设计 > UI/UE

【转载】获取系统时间(精确到微秒),驱动中KeQueryPerformanceCounter,Win32程序QueryPerformanceCounter

2012-08-21 16:07 1046 查看
1.在驱动中获取us级的时间间隔

今天在做驱动开发时,需要操作时间,而且还要精确到us,而GetTickCount()函数只能精确到ms,所以就用到下面的函数:

LARGE_INTEGER KeQueryPerformanceCounter( IN PLARGE_INTEGER PerformanceFrequency OPTIONAL );

其中PerformanceFrequency 表示CPU的频率,此函数返回系统从启动到此刻的时间,类型为LARGE_INTEGER。

使用举例:

ULONG QuerySystemTime()

{

LARGE_INTEGER CurTime, Freq;

CurTime = KeQueryPerformanceCounter(&Freq);

return (ULONG)((CurTime.QuadPart * 1000)/Freq.QuadPart);

}

这个函数的精度为1ms,如果想要得到微秒,则把 1000 改为 1000000。

2.在应用程序中精确获取系统时间,则使用下面函数:

QueryPerformanceCounter(IN OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);

但这是获取CPU频率就需要下面这个函数了:

QueryPerformanceFrequency(IN OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);

例子:

*****************************************************test.cpp******************************************************************

#include <stdio.h>

#include <Windows.h>

LONGLONG GetLastTime()

{

// CPU频率

LARGE_INTEGER liQPF;

// 记录开始和结束时间

LARGE_INTEGER liStartTime, liEndTime;

// 记录过程时间

LONGLONG llLastTime;

// 获取CPU频率

QueryPerformanceFrequency(&liQPF);

// 获取开始时间

QueryPerformanceCounter(&liStartTime);

Sleep(10);

// 获取结束时间

QueryPerformanceCounter(&liEndTime);

// 计算持续时间(us)

llLastTime = 1000000 * (liEndTime.QuadPart - liStartTime.QuadPart) / liQPF.QuadPart;

return llLastTime;

}

int main(void)

{

DWORD start,stop;

start = GetTickCount();

Sleep(10);

stop = GetTickCount();

printf("%d ms\n",stop-start); //GetTickCount()计算得到的时间间隔精度为15ms,例如计算10ms间隔结果为0

printf("%d us\n",GetLastTime());//应用程序中时间间隔计算精确到us,QueryPerformanceCounter()

return 0;

}

*****************************************************test.cpp******************************************************************

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: