实施< Windows中用C ++延迟1ms

时间:2015-04-19 05:23:21

标签: c++ boost sleep

近一个星期以来,我一直在自学c ++,以推进我即将开设的大学c ++课程的学习。现在我正处于我的这个项目中,我正试图看看我是否可以实现准确的延迟或睡眠时间不到1毫秒。

我正在研究如何在Windows中实现这一点,并且已经看到了如下答案:

  • 睡眠不准确
  • 在Windows中无法睡眠不到1毫秒,但在* UX平台中无法睡眠
  • 在C ++中使用boost库

所以我尝试在visual studio 2013中获取boost库并通过gob00st

找到此代码段c++ Implementing Timed Callback function

我稍后修改了截止日期:

class Deadline 
{

int i = 0;
public:
Deadline(deadline_timer &timer) : t(timer) {
    wait();
}

void timeout(const boost::system::error_code &e) {
    if (e)
        return;

    cout << i++ << endl;
    wait();
}

然后改变了这一行

void wait() {
    t.expires_from_now(boost::posix_time::seconds(1)); //repeat rate here
    t.async_wait(boost::bind(&Deadline::timeout, this, boost::asio::placeholders::error));
}

到这些

void wait() {
    t.expires_from_now(boost::posix_time::microseconds(100)); //repeat rate here
    t.async_wait(boost::bind(&Deadline::timeout, this, boost::asio::placeholders::error));
}

运行它并在10秒后输出正好数字10000,所以看起来我仍然坚持在Windows无法睡眠或延迟不到1ms的窗口中限制。

然后我发现这个答案说我可以使用Boost的CPU精确定时器来实现这一点。 Accurate delays between notes when synthesising a song

如何编辑代码片段以使用Cpu精确定时器而不是使用boost的asio定时器?

2 个答案:

答案 0 :(得分:2)

时间安排有两个不同的问题。一个是准确的时间测量。这可以通过升级或新标准计时在现代计算机上实现。另一个问题与睡眠,唤醒,线程切换等有关。这里需要支持操作系统。你通常到这里最快的是1ms。不久前它在10ms到20ms的范围内。如果您需要比操作系统提供的更短的延迟,您将无法入睡。相反,你必须在自己的循环中'燃烧'时间。

答案 1 :(得分:1)

Windows具有高性能计数器API。

您需要获取QueryPerformanceCounter的刻度并除以QueryPerformanceFrequency提供的处理器频率。

还有所谓的 HPET Timer 。 高精度事件定时器(HPET)由英特尔和微软联合开发,旨在满足多媒体和其他时间敏感应用的时序要求。自Windows Vista以来,HPET一直支持Windows,Windows 7和Windows 8硬件徽标认证需要硬件平台支持HPET。

对于您的特定情况,您可以使用只有 ms 精度的timeGetTime