WEB开发网
开发学院软件开发VC VC中基于 Windows 的精确定时 阅读

VC中基于 Windows 的精确定时

 2006-07-20 11:41:47 来源:WEB开发网   
核心提示: BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); BOOLQueryPerformanceCounter(LARGE_INTEGER *lpCount);数据类型ARGE_INTEGER既可以是一个8字节长的整型数,也可以

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);

数据类型ARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构, 其具体用法根据编译器是否支持64位而定。该类型的定义如下:

typedef union _LARGE_INTEGER
    {
      struct
      {
       DWORD LowPart ;// 4字节整型数
       LONG HighPart;// 4字节整型数
      };
      LONGLONG QuadPart ;// 8字节整型数
     
    }LARGE_INTEGER ;

在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。下列代码实现1ms的精确定时:

LARGE_INTEGER litmp;
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;// 获得初始值
    do
    {
     QueryPerformanceCounter(&litmp);
     QPart2 = litmp.QuadPart;//获得中止值
     dfMinus = (double)(QPart2-QPart1);
     dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
    }while(dfTim<0.001);

其定时误差不超过1微秒,精度与CPU等机器配置有关。 下面的程序用来测试函数Sleep(100)的精确持续时间:

LARGE_INTEGER litmp;
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;// 获得初始值
    Sleep(100);
    QueryPerformanceCounter(&litmp);
    QPart2 = litmp.QuadPart;//获得中止值
    dfMinus = (double)(QPart2-QPart1);
    dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒  

由于Sleep()函数自身的误差,上述程序每次执行的结果都会有微小误差。下列代码实现1微秒的精确定时:

LARGE_INTEGER litmp;
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;// 获得初始值
    do
    {
     QueryPerformanceCounter(&litmp);
     QPart2 = litmp.QuadPart;//获得中止值
     dfMinus = (double)(QPart2-QPart1);
     dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
    }while(dfTim<0.000001);

其定时误差一般不超过0.5微秒,精度与CPU等机器配置有关。

上一页  1 2 3 4 5 

Tags:VC 基于 Windows

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接