我想模擬一個點在Linux下以恆定的速度下降。爲了這個工作,我需要時間到毫秒的分辨率。現在這部分是好的,但我有一個clock_gettime的問題。clock_gettime返回一個無意義的值
當「tv_nsec」字段繞到約億,它開始回到接近零,且時間clock_gettime是檢索是時間檢索以前的迭代之前。請注意,每次該字段換行時都不會發生這種情況,但它確實發生。
要調試,我把它寫從clock_gettime和retrived delta值返回值:
迭代:
gettime.seconds:1362720808,gettime.us:993649771,總: 1362721801649我們
三角洲:0.014另一個循環:
gettime.seconds:1362720808,gettime.us:993667981,總:1362721801667我們
增量:0.015另一迭代:
gettime.seconds:1362720808,gettime.us:993686119,總:1362721801686我們
三角洲:0.015迭代問題:
gettime.seconds:1362720809,gettime.us:20032630,總:1362720829032我們
三角洲:-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」進行編譯。
這將循環直到問題發生,即增量因時間而爲負。我的電腦只需要幾秒鐘。
很抱歉的冗長的問題,但感謝所有幫助我可以提前得到:)
爲什麼0.5在return語句? – 2014-09-23 18:47:39