VC 获取系统时间差
注意:使用相应的函数,记得包含相应的头文件。
许成喜 2012-10-5
方法一 利用 SYSTEMTIME
SYSTEMTIME STRUCT{
WORD wYear ;
WORD wMonth ;
WORD wDayOfWeek ;
WORD wDay ;
WORD wHour ;
WORD wMinute ;
WORD wSecond ;
WORD wMilliseconds ;
}SYSTEMTIME ENDS
该方法可以获取毫秒级别的时间差。需要用到 Windows API。
要求:#include
用法:
SYSTEMTIME start,end;
GetLocalTime(&start);
…………
GetLocalTime(&end);
unsigned long TimeDiff(SYSTEMTIME start,SYSTEMTIME end)
{
long
lLMinllis = (start.wHour*3600 + start.wMinute*60 + start.wSecond)*1000
+ start.wMilliseconds;
long
lRMinllis
=
(end.wHour*3600
+
end.wMinute*60
+
end.wSecond)*1000
+ end.wMilliseconds;
return (lRMinllis
-
lLMinllis);
}
方法二 利用 GetTickCount()函数
该方法可以获取毫秒级别的时间差。
要求:#include
用法:
DWORD start,end;
start = GetTickCount();
……………………….
end = GetTickCount();
方法三 使用 clock()函数
要求:#include
用法:精确到毫秒级别
double
time=clock();
………………………..
double
Inteval=clock()-time;
方法四 获取高精度时间差
QueryPerformanceFrequency() ,QueryPerformanceCounter()函数
这两个函数是 VC 提供的仅供 Windows 9X 使用的高精度时间函数,并要求计算机从硬件上
支持高精度计时器。QueryPerformanceFrequency()函数和 QueryPerformanceCounter()函数的
原型为:
BOOL QueryPerformanceFrequency(LARGE—INTEGER *lpFrequency);
BOOL QueryPerformanceCounter(LARGE—INTEGER *lpCount)
数据类型 LARGE—INTEGER 既可以是一个作为 8 字节长的整型数,也可以是作为两
个 4 字节长的整型数的联合结构,其具体用法根据编译器是否支持 64 位而定。该类型的定
义如下:
;
union —LARGE_INTEGER
typedef
{
struct
{
DWORD
LONG
LowPart;
HighPart;
//
//
4 字节整型数
4 字节整型数
};
LONGLONG
QuadPart;
//
8 字节整型数
} LARGE—INTEGER;
在进行计时之前,应该先调用 QueryPerformanceFrequency()函数获得机器内部计时器的
时钟频率。笔者在主频为 266、300、333 的三种 PentiumⅡ机器上使用该函数,得到的时钟
频率都是 1193180Hz。接着,笔者在需要严格计时的事件发生之前和发生之后分别调用
QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就可以计算出事件
经历的精确时间。
要求:
#include
#include
用法:
LARGE_INTEGER
LONGLONG
DOUBLE
litmp;
QPstart,QPend;
dfMinus,dfFreq,dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (DOUBLE)litmp.QuadPart;
QueryPerformanceCounter(&litmp);
QPstart = litmp.QuadPart;
…………………………..
QueryPerformanceCounter(&litmp);
QPend = litmp.QuadPart;
dfMinus = (double)(QPend - QPstart);
dfTim = dfMinus/dfFreq; //单位(秒)