【问题标题】:Implementing < 1ms delay in Windows in C++在 C++ 中在 Windows 中实现 < 1ms 延迟
【发布时间】:2015-04-19 05:23:20
【问题描述】:

近一个星期以来,我一直在自学 C++,以提前学习我即将在大学开设的 C++ 课程。现在我在我的这个项目中,我想看看我是否可以实现准确的延迟或睡眠时间少于 1 毫秒。

我对如何在 Windows 中实现这一点进行了一些研究,并看到了类似的答案:

  • 睡眠不准确
  • 在 Windows 中睡眠时间不能少于 1 毫秒,但在 *UX 平台中可能
  • 在 C++ 中使用 boost 库

所以我尝试在 Visual Studio 2013 中获取 boost 库,并通过 gob00st 找到了这个 sn-p c++ Implementing Timed Callback function

我稍微修改了deadline类:

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 中的这个限制,你不能睡眠或延迟少于 1 毫秒。

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

如何编辑代码 sn-p 以使用 Cpu 精度计时器而不是使用 boost 的 asio 计时器?

【问题讨论】:

  • 寻找 std::chrono 设施
  • 抢占式操作系统中的正常进程无法休眠准确的时间。您要实现的目标需要实时功能。你需要那个干什么?
  • 现在没有什么特别的,我只是想看看我能做什么的限制。如果我需要在 windows 中使用小于 1 毫秒的时间延迟,还有一个我可以在未来使用的模板会很好

标签: c++ boost sleep


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Windows 有一个高性能计数器 API。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多