今天在做驱动开发时,需要操作时间,而且还要精确到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******************************************************************