代码之家  ›  专栏  ›  技术社区  ›  Roee Adler

更换电脑后,Sleep()的准确性会降低吗?C

  •  4
  • Roee Adler  · 技术社区  · 16 年前

    > wait for keystroke...
    > ! keystroke occurred
    > send ON message
    > wait 150ms
    > send OFF message
    

    不同的按键有不同的等待时间,在20ms到150ms之间(这是一个非常确定的时间,取决于特定的按键)。时机非常重要。等待是使用simple执行的 Sleep()

    我没有安装以前的电脑,所以它可能安装了一些额外的软件包。此外,我很惭愧地承认,我不记得以前的电脑是Windows 2000还是Windows XP。我很确定这是XP,但不是100%(我现在无法检查……)。新的是Windows XP。

    6 回复  |  直到 16 年前
        1
  •  3
  •   nos    16 年前

    XP的时间分辨率约为10ms,系统基本上每10ms“滴答”一次。因此,睡眠并不是一种准确计时的好方法。我很确定win2000有相同的分辨率,但如果我错了,这可能是一个原因。

    您可以将分辨率更改为至少1ms-请参阅 http://technet.microsoft.com/en-us/sysinternals/bb897569.aspx http://www.lucashale.com/timerresolution/

    可能是你的旧机器上的分辨率被改变了。

        2
  •  2
  •   arul    16 年前

    spinlock . Sleep() 函数提示调度程序至少在一段时间内不要重新调度给定的线程

        3
  •  1
  •   Eugene N.    16 年前

    通常Sleep()会导致延迟~15ms或周期倍数~15ms,具体取决于睡眠值。 以下伪代码是找出其工作原理的好方法之一:

    while true do
        print(GetTickCount());
        Sleep(1);
    end;
    

    此外,它还将表明,对于Windows XP和Vista/Win 7,此代码的行为是不同的

        4
  •  1
  •   MattyT    16 年前

    正如其他人所提到的,睡眠的准确性很差。

    // Set up the io_service and deadline_timer
    io_service io_
    deadline_timer timer(io_service);
    
    // Configure the wait period
    timer.expires_from_now(posix_time::millisec(5));
    timer.wait();
    

    Asio为您的平台使用最有效的实现;在Windows上,我认为它使用重叠IO。

        5
  •  0
  •   Larry Watanabe    16 年前

        6
  •  0
  •   i_am_jorf    16 年前

    睡眠取决于系统时钟。你的新机器可能和你以前的机器有不同的计时。从 documentation :

    此函数使线程 放弃剩余的时间 基于以下值的间隔 以恒定速率“滴答”。如果 dw毫秒小于 系统时钟的分辨率 指定的时间长度。如果 dw毫秒大于1 勾选但不到两个,等待可以 在一到两个刻度之间的任何地方, 等等。为了提高 timeGetDevCaps函数来确定 支持的最小计时器分辨率 timeBeginPeriod函数用于 显著影响系统时钟, 系统功率使用和调度器。 如果你称之为timeBeginPeriod,就称之为 一定要调用timeEndPeriod 功能在最后

    文档似乎暗示你可以尝试让它更准确,但如果我是你,我不会这么做。只需使用计时器。

    你用什么计时器代替了它?如果你使用了SetTimer(),那么这个计时器也很糟糕。
    正确的解决方案是使用更高的分辨率 TimerQueueTimer .