我正在尝试模拟在 linux 中以恒定速率下降的点。为此,我需要获得毫秒分辨率的时间。现在这部分很好,但我遇到了clock_gettime的问题。
当 'tv_nsec' 字段回绕到大约 100000000 时,它开始回到接近零的位置,并且clock_gettime检索到的时间在前一次迭代检索到的时间之前。请注意,并非每次字段换行时都会发生这种情况,但确实会发生。
为了调试,我让它写出从clock_gettime返回的值和检索的增量值:
迭代:
gettime.seconds:1362720808,gettime.us:993649771,总计:1362721801649 us
delta:0.014另一个迭代:
gettime.seconds:1362720808,gettime.us:993667981,总计:1362721801667 us
delta:0.015另一个迭代:
gettime.seconds:1362720808,gettime.us:993686119,总计:1362721801686 us
delta:0.015有问题的迭代:
gettime.seconds:1362720809,gettime.us:20032630,总计:1362720829032 us
delta:-972.661
请注意,增量以秒为单位,其计算方法是将毫秒除以 1000,再加上从过去的时间减去未来的时间(等于负数),然后除以 1000,它使增量为积极的。
重现问题的代码在这里:
#include <iostream>
#include <sys/time.h>
using namespace std
double prevMillis = 0.0;
double getMillis()
{
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
cout << "gettime.seconds: " << ts.tv_sec << " , gettime.us: " << ts.tv_nsec << ", total: " << ((ts.tv_sec * 1000) + (ts.tv_nsec / 1000)) << " ms" << endl;
return ((ts.tv_sec * 1000) + (ts.tv_nsec / 1000)) + 0.5;
}
int main()
{
double delta = 0.0;
prevMillis = getMillis();
while(delta >= 0)
{
delta = (getMillis() - prevMillis) / 1000;
prevMillis = getMillis();
cout << "Delta: " << delta << endl << endl;
}
return 0;
}
请注意,必须使用“-lrt”编译时钟功能。
这将循环直到问题发生,即由于时间的原因增量为负。在我的电脑上只需要几秒钟。
抱歉这个冗长的问题,但感谢我提前获得的任何帮助:)