博客
关于我
QueryPerformanceCounter与QueryPerformanceFrequency
阅读量:795 次
发布时间:2023-03-02

本文共 1417 字,大约阅读时间需要 4 分钟。

在Windows操作系统中,实现高精度的计时器可以使用QueryPerformanceCounterQueryPerformanceFrequency这两个函数。通过获取高精度计时器的频率和计数值,可以计算出非常精确的时间差。

基本原理

QueryPerformanceFrequency函数用于获取系统硬件支持的高精度计时器的频率。QueryPerformanceCounter函数则用于获取当前的计数值。通过获取计数器在使用这两个函数之前和之后的值,可以计算出时间差。具体步骤如下:

  • 初始化LARGE_INTEGER类型的变量来存储频率和计数器值。
  • 调用QueryPerformanceFrequency函数填充频率值。
  • 调用QueryPerformanceCounter函数获取当前的计数器值。
  • 计算时间差,公式为:dTime = dCount / dFrequency
  • 具体实现

    以下是一个详细的代码示例:

    #include 
    double PCFreq = 0.0;
    __int64 CounterStart = 0;
    void StartCounter()
    {
    LARGE_INTEGER li;
    if (!QueryPerformanceFrequency(&li))
    {
    cout << "QueryPerformanceFrequency failed!\n";
    return;
    }
    PCFreq = double(li.QuadPart) / 1000.0; // 转换为秒
    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
    }
    double GetCounter()
    {
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart - CounterStart) / PCFreq;
    }
    int main()
    {
    StartCounter();
    Sleep(1000); // 等待1秒
    cout << GetCounter() << "\n";
    return 0;
    }

    输出结果

    运行上述代码后,输出结果应接近1秒,具体取决于系统的性能。

    常见问题

  • 频率转换:如果需要以微秒为单位输出,可以将PCFreq乘以1000000:
    PCFreq = double(li.QuadPart) / 1000000.0;
  • 错误处理:在StartCounter函数中,检查QueryPerformanceFrequency返回值是否为FALSE,如果返回FALSE表示高精度计时器不支持,可能需要使用低精度计时器。
  • 注意事项

    • QueryPerformanceFrequencyQueryPerformanceCounter函数需要传递指针类型的LARGE_INTEGER,确保传入正确的内存地址。
    • 在多线程环境中,使用QueryPerformanceCounter可能会遇到竞态条件,需要进行适当的同步。

    通过以上方法,可以在Windows系统中实现高精度的时间计数,适用于需要极高精度的场景。

    转载地址:http://jrtfk.baihongyu.com/

    你可能感兴趣的文章
    PHP应用目录结构设计
    查看>>
    PHP应用程序连接MSQL数据库Demo(附crud程序)
    查看>>
    PHP应用程序连接Oracle数据库Demo(附Oracle客户端安装文件)
    查看>>
    PHP开发api接口安全验证
    查看>>
    PHP开发规范PSR
    查看>>
    PHP开发遇到错误0001
    查看>>
    php异常处理
    查看>>
    PHP引入了泛型和集合两大重要特性,大大改善 PHP 代码的可维护性和可读性
    查看>>
    PHP引擎php.ini参数优化
    查看>>
    PHP引用(&)使用详解
    查看>>
    php引用及垃圾回收
    查看>>
    php当前时间的集中写法
    查看>>
    php循环比较数组中的值,如何从PHP数组中计算值并在foreach循环中仅显示一次值?...
    查看>>
    php微信 开发笔记,微信WebApp开发总结笔记
    查看>>
    php微信公众号开发access_token获取
    查看>>
    php微信公众号开发微信认证开发者
    查看>>
    php微信公众号开发用户基本信息
    查看>>
    php怎么将对象变成数组,php怎么将对象转换成数组
    查看>>
    RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列
    查看>>
    php怎样比较两数大小,jquery如何判断两个数值的大小
    查看>>