2013-03-08 55 views
1

我想模擬一個點在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

爲什麼0.5在return語句? – 2014-09-23 18:47:39

回答

4

tv_nsec納秒,即1億個(1/1,000,000,000)一秒鐘。然而,你的計算是將它看作微秒。

這裏的修復:

return ((ts.tv_sec * 1000) + (ts.tv_nsec/1000000)) + 0.5; 
               ^^^ 
+0

非常感謝,在這裏我想這不是我的錯。我不太確定我是如何錯過的。 – Dylan 2013-03-08 06:25:30