我正在尝试使用while循环创建一个持续测量3000μs(3毫秒)的计时器,虽然它在大多数时间都可以工作,但其他时候该计时器可能会延迟500μs。为什么会发生这种情况,有没有更精确的方法来制作这样的计时器?
int getTime() {
chrono::microseconds μs = chrono::duration_cast< chrono::microseconds >(
chrono::system_clock::now().time_since_epoch() //Get time since last epoch in μs
);
return μs.count(); //Return as integer
}
int main()
{
int target = 3000, difference = 0;
while (true) {
int start = getTime(), time = start;
while ((time-start) < target) {
time = getTime();
}
difference = time - start;
if (difference - target > 1) { //If the timer wasn't accurate to within 1μs
cout << "Timer missed the mark by " + to_string(difference - target) + " microseconds" << endl; //Log the delay
}
}
return 0;
}
我希望这段代码记录的延迟始终在5毫秒左右,但是the console output looks like this。
编辑以澄清:我正在Windows 10 Enterprise Build 16299上运行,但是该行为在Debian虚拟机上仍然存在。
答案 0 :(得分:1)
您还需要考虑其他正在运行的进程。操作系统可能会抢占您的进程以将CPU时间分配给其他进程/线程,并且会不确定地将控制权返回给运行此计时器的进程/线程。
当然,当我们考虑实时操作系统或固定调度程序时,这并不是100%正确。但是,如果您在通用计算机上运行,则代码中可能就是这种情况。
答案 1 :(得分:-1)
由于您在Windows上运行,因此RTOS负责通过NTP保持时间,因为C ++没有内置功能。检出此Windows API中的SetTimer()
函数:http://msdn.microsoft.com/en-us/library/ms644906(v=vs.85).aspx。
如果您希望通过C ++获得最好,最高分辨率的时钟,请查看chrono
库:
#include <iostream>
#include <chrono>
#include "chrono_io"
int main()
{
typedef std::chrono::high_resolution_clock Clock;
auto t1 = Clock::now();
auto t2 = Clock::now();
std::cout << t2-t1 << '\n';
}