timeBeginPeriod 高精度定时器 Sleep

1.timeBeginPeriod 与sleep配合使用实现高精度
复制代码
#include "timeapi.h"
#pragma comment(lib, "winmm")
//
DWORD __stdcall ThreadTest(LPVOID pThreadParam)
{
    CLog mLog;
    int i = 100;
    timeBeginPeriod(1);//1表示1ms精度
    while (i--)
    {
        mLog.WriteLog("%d", i);
        Sleep(1000);
    }
    timeEndPeriod(1);
    return 0;
}
复制代码

 

测试结果,不使用timeBeginPeriod 的Sleep精度是15ms,使用timeBeginPeriod 的Sleep精度是3ms

sleep本身的误差无法避免,虽然精度设置了1ms但无论sleep(1000)还是sleep(10) 总会有3ms误差

缺点:大幅提高了cpu占用率

 

2.另一个高精度的sleep函数

复制代码
//休眠指定毫秒数
void MSleep(long lTime)
{
    LARGE_INTEGER litmp;//64位有符号整数
    LONGLONG QPart1, QPart2;
    double dfMinus, dfFreq, dfTim, dfSpec;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;
    dfSpec = 0.001*lTime;

    do
    {
        QueryPerformanceCounter(&litmp);
        QPart2 = litmp.QuadPart;
        dfMinus = (double)(QPart2 - QPart1);
        dfTim = dfMinus / dfFreq;
    } while (dfTim < dfSpec);
}

//使用时直接调用就可以了
MSleep(1000);//休眠1秒
复制代码

 

posted @   ckrgd  阅读(631)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2021-02-23 MFC vc++ 写 word 文件,使用MSWORD.OLB
点击右上角即可分享
微信分享提示