在 C++ 中 Windows 中实现 < 1ms 的延迟
Implementing < 1ms delay in Windows in C++
近一个星期以来,我一直在自学 c++,以推进我即将在大学学习的 c++ 课程。现在我在我的这个项目中,我试图看看我是否可以实现准确的延迟或睡眠少于 1 毫秒。
我对如何在 windows 中实现这一点进行了一些研究,并看到了如下答案:
- 睡眠不准确
- 在 windows 中睡眠时间不能少于 1 毫秒,但在 *UX 平台中可以
- 在 C++ 中使用 boost 库
所以我尝试在 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' 在你自己的循环中的时间。
近一个星期以来,我一直在自学 c++,以推进我即将在大学学习的 c++ 课程。现在我在我的这个项目中,我试图看看我是否可以实现准确的延迟或睡眠少于 1 毫秒。
我对如何在 windows 中实现这一点进行了一些研究,并看到了如下答案:
- 睡眠不准确
- 在 windows 中睡眠时间不能少于 1 毫秒,但在 *UX 平台中可以
- 在 C++ 中使用 boost 库
所以我尝试在 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' 在你自己的循环中的时间。