2010-05-18 34 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