SetWaitableTimer时间不准

yangyangqinqin 2016-10-27 09:20:15
我现在用vs2010 c++/cli编写程序,调用API函数SetWaitableTimer来实现精确延时,
WINBASEAPI BOOL WINAPI SetWaitableTimer( __in HANDLE hTimer, __in const LARGE_INTEGER *lpDueTime, __in LONG lPeriod, __in_opt PTIMERAPCROUTINE pfnCompletionRoutine, __in_opt LPVOID lpArgToCompletionRoutine, __in BOOL fResume )

我发现,设置好lpDueTime后,程序在winxp系统下能精确延时,但在win7下有时能精确延时,但有时却不能精确延时,从调用SetWaitableTimer到实际回调执行的间隔比我设置的延时时间要长一些,长多少没有规律,例如我设置延时50ms,实际延时可能为60ms。
我试过几台win7的机子,都存在这个问题,包括64位和32位的系统,但在xp系统下就没有任何问题。

请问各位,这个是什么问题,是什么地方设置不对吗?
...全文
429 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BeanJoy 2016-10-28
  • 打赏
  • 举报
回复
引用 2 楼 yangyangqinqin 的回复:
[quote=引用 1 楼 oyljerry 的回复:] 这个API应该本身就有精度问题。
不是这个API号称能精确到100ns吗? 我在XP下试过了,确实挺准的,前后不差1ms,但在win7下就。。。[/quote] 不是精确到100ns吧,是单位为100ns吧,以下是MSDN上的例子,看说明是10 senconds,单位应该为100ns。 windows不是实时操作系统,很难做到精确的延时,你可用循环Sleep(0)看下每个间隔的耗时。

HANDLE hTimer = NULL;
    LARGE_INTEGER liDueTime;

    liDueTime.QuadPart=-100000000;

    // Create a waitable timer.
    hTimer = CreateWaitableTimer(NULL, TRUE, "WaitableTimer");
    if (NULL == hTimer)
    {
        printf("CreateWaitableTimer failed (%d)\n", GetLastError());
        return 1;
    }

    printf("Waiting for 10 seconds...\n");

    // Set a timer to wait for 10 seconds.
    if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
    {
        printf("SetWaitableTimer failed (%d)\n", GetLastError());
        return 2;
    }
yangyangqinqin 2016-10-28
  • 打赏
  • 举报
回复
引用 5 楼 brk1985 的回复:
如果是定时器功能,像3楼说的,试试timeSetEvent看看。 如果单纯延迟,WaitForSingleObject就够了。。。
WaitForSingleObject的精度似乎跟Sleep一样不准确
yangyangqinqin 2016-10-28
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
试试多媒体时钟 timeSetEvent
感谢,用timeSetEvent应该不错 但还是想知道一下 SetWaitableTimer在win7下为什么不准的问题,不知道有没有其他朋友遇到过
zgl7903 2016-10-28
  • 打赏
  • 举报
回复
试试多媒体时钟 timeSetEvent
brk1985 2016-10-28
  • 打赏
  • 举报
回复
如果是定时器功能,像3楼说的,试试timeSetEvent看看。 如果单纯延迟,WaitForSingleObject就够了。。。
yangyangqinqin 2016-10-27
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
这个API应该本身就有精度问题。
不是这个API号称能精确到100ns吗? 我在XP下试过了,确实挺准的,前后不差1ms,但在win7下就。。。
oyljerry 2016-10-27
  • 打赏
  • 举报
回复
这个API应该本身就有精度问题。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧