2010-05-18 33 views
1

我有一個緩存與C中的UTC時間戳,我每十秒鐘後播放該緩衝區。問題是兩個數據包之間的時間差異不一致。經過5至10次迭代後,時差變爲9,11,然後再變10次。請幫助我理清這個問題。我在UTC時間使用<time.h>UTC的時間戳在Windows上

+0

我不確定你的問題是什麼。你睡了10秒,找回時間,找到差異並不總是10秒? – Artefacto 2010-05-18 10:27:10

+0

是我的線程10秒後,它再次獲得UTC時間併發送。 – Siddiqui 2010-05-18 10:28:49

回答

1

一個睡眠X毫秒的線程不能保證精確的睡眠幾毫秒。我假設你有去像一個語句:

while(1) { 
    ... 
    sleep(10); // Sleep for 10 seconds. 
    // fetch timestamp and send 
} 

,如果你睡在一個循環更短的週期(比如說20毫秒)檢查,直到時間已過期,您將得到的時間更精確的測量儀。當你睡10秒時,你的線程會進一步移出底層操作系統的即時調度優先級。

如果您進行睡眠(10) - >發送 - >睡眠(10)類型的循環,您可能還會考慮發送時間戳所需的時間可能會有所不同,具體取決於網絡條件等。所發送的時間將實際添加到下一次睡眠(10)。

嘗試是這樣的(原諒我,我的C是有點生疏):

bool expired = false; 
double last, current; 
double t1, t2; 
double difference = 0; 

while(1) { 
    ... 
    last = (double)clock(); 
    while(!expired) { 
     usleep(200); // sleep for 20 milliseconds 
     current = (double)clock(); 
     if(((current - last)/(double)CLOCKS_PER_SEC) >= (10.0 - difference)) 
     expired = true; 
    } 
    t1 = (double)clock(); 
    // Set and send the timestamp. 
    t2 = (double)clock(); 
    // 
    // Calculate how long it took to send the stamps. 
    // and take that away from the next sleep cycle. 
    // 
    difference = (t2 - t1)/(double)CLOCKS_PER_SEC; 
    expired = false; 
} 

如果不打擾關於使用標準C庫,你可以看看使用的高分辨率定時器功能諸如QueryPerformanceFrequency/QueryPerformanceCounter函數之類的窗口。

LONG_INTEGER freq; 
LONG_INTEGER t2, t1; 
// 
// Get the resolution of the timer. 
// 
QueryPerformanceFrequency(&freq); 

// Start Task. 
QueryPerformanceCounter(&t1); 

... Do something .... 

QueryPerformanceCounter(&t2); 

// Very accurate duration in seconds. 
double duration = (double)(t2.QuadPart - t1.QuadPart)/(double)freq.QuadPart; 
+1

P.S.你可能想要使用比difftime更精確的東西,因爲它的分辨率是1秒。 clock()與CLK_PER_SECOND常量。 – 2010-05-18 11:29:12

+0

CLOCK_PER_SECOND是否可用於Windows? – Siddiqui 2010-05-18 11:40:11

+1

是的,它是c標準庫的一部分。 CLOCKS_PER_SEC。爲了獲得更準確的時間讀數double t =(dobule)clock()/(double)CLOCKS_PER_SEC; – 2010-05-18 13:30:05

3

如果你的時間標記只有1秒的分辨率,那麼最不重要的數字總會有+/- 1的不確定性(在這種情況下爲+/- 1秒)。

說明:如果你只有1秒的分辨率,那麼你的時間值是quantized。由這種量化值表示的實時t的範圍爲t..t+0.9999。如果取兩個這樣的時間差,即t0t1,則t1-t0中的最大誤差爲-0.999..+0.999,其在量化時爲+/-1秒。所以在你的情況下,你會發現在9..11秒範圍內的差異值。

+0

請解釋一下1秒分辨率是什麼意思?我該如何解決這個問題。 – Siddiqui 2010-05-18 10:21:58

+0

@阿曼:請參閱上面的進一步解釋。 – 2010-05-18 10:55:20