在 C++ 中 Windows 中实现 < 1ms 的延迟

Implementing < 1ms delay in Windows in C++

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

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

所以我尝试在 visual studio 2013 年获取 boost 库,并找到了这个片段 c++ Implementing Timed Callback function by gob00st

我修改了截止日期class一点:

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

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

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

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

还有所谓的HPET定时器。 高精度事件定时器 (HPET) 由 Intel 和 Microsoft 联合开发,以满足多媒体和其他对时间敏感的应用程序的计时要求。自Windows Vista 以来,Windows 一直支持HPET,Windows 7 和Windows 8 硬件标志认证要求硬件平台支持HPET。

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

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