近一个星期以来,我一直在自学c ++,以推进我即将开设的大学c ++课程的学习。现在我正处于我的这个项目中,我正试图看看我是否可以实现准确的延迟或睡眠时间不到1毫秒。
我正在研究如何在Windows中实现这一点,并且已经看到了如下答案:
所以我尝试在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定时器?
答案 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
。