我有一個緩存與C中的UTC時間戳,我每十秒鐘後播放該緩衝區。問題是兩個數據包之間的時間差異不一致。經過5至10次迭代後,時差變爲9,11,然後再變10次。請幫助我理清這個問題。我在UTC時間使用<time.h>
。UTC的時間戳在Windows上
回答
一個睡眠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;
P.S.你可能想要使用比difftime更精確的東西,因爲它的分辨率是1秒。 clock()與CLK_PER_SECOND常量。 – 2010-05-18 11:29:12
CLOCK_PER_SECOND是否可用於Windows? – Siddiqui 2010-05-18 11:40:11
是的,它是c標準庫的一部分。 CLOCKS_PER_SEC。爲了獲得更準確的時間讀數double t =(dobule)clock()/(double)CLOCKS_PER_SEC; – 2010-05-18 13:30:05
如果你的時間標記只有1秒的分辨率,那麼最不重要的數字總會有+/- 1的不確定性(在這種情況下爲+/- 1秒)。
說明:如果你只有1秒的分辨率,那麼你的時間值是quantized
。由這種量化值表示的實時t
的範圍爲t..t+0.9999
。如果取兩個這樣的時間差,即t0
和t1
,則t1-t0
中的最大誤差爲-0.999..+0.999
,其在量化時爲+/-1
秒。所以在你的情況下,你會發現在9..11
秒範圍內的差異值。
請解釋一下1秒分辨率是什麼意思?我該如何解決這個問題。 – Siddiqui 2010-05-18 10:21:58
@阿曼:請參閱上面的進一步解釋。 – 2010-05-18 10:55:20
- 1. 從UTC UTC時間戳到UTC的UTC
- 2. UTC時間從時間戳
- 3. Postgres UTC時間戳?
- 4. UTC時間戳到正常時間戳?
- 5. utc在utc時間戳記上做了什麼?
- 6. PHP UTC時間戳創建
- 7. 轉換成時間戳UTC
- 8. UTC時間戳解釋
- 9. 轉換爲UTC時間戳
- 10. 如何從UTC時間戳
- 11. iOS獲取UTC時間戳
- 12. 將本地時間戳UTC時間戳在Java中
- 13. 時間戳在Windows
- 14. 將UTC中的時間戳轉換爲時間戳
- 15. python:來自pytz本地時間戳的UTC時間戳
- 16. Python:將UTC時間元轉換爲UTC時間戳
- 17. 在Lua中獲取UTC UNIX時間戳
- 18. 在JavaScript中創建UTC時間戳
- 19. 在UTC推進時間戳行爲
- 20. 將UTC時間戳轉換爲本地設備時間戳
- 21. 爲什麼本地時間戳等於UTC時間戳?
- 22. 將時間戳轉換爲UTC時區
- 23. UTC時間戳的ODBC標量函數?
- 24. 得到使用的strftime()UTC時間戳
- 25. 獲取UTC格式的GWT時間戳
- 26. Python中UTC時間戳的UUID1?
- 27. Perl獲取UTC時間並獲得UTC時間戳之間的差異
- 28. 如何確保時間戳在任何機器的UTC時間
- 29. java顯示Windows UTC時間
- 30. Azure流分析UTC時間戳
我不確定你的問題是什麼。你睡了10秒,找回時間,找到差異並不總是10秒? – Artefacto 2010-05-18 10:27:10
是我的線程10秒後,它再次獲得UTC時間併發送。 – Siddiqui 2010-05-18 10:28:49