我在Linux2.6上使用clock_gettime() (从time.h)来控制线程循环中的计时。我需要500毫秒以内的+/- 5毫秒的时间。它似乎给了我500毫秒,然后开始漂移或抖动到+/- 30毫秒:
我正在使用CLOCK_REALTIME调用与它。有什么办法来改善它的偏差吗?我只是简单地数每一个mS与它和一旦计数器命中500火停止一个中断。
这也在QT4.3框架内。QTimer似乎比这更紧张。
发布于 2015-06-08 05:27:10
根据你问题的措辞,我觉得你可能是在错误地积累你的时间差异。
试试这种方法:
#include <stdio.h>
#include <time.h>
long elapsed_milli( struct timespec * t1, struct timespec *t2 )
{
return (long)(t2->tv_sec - t1->tv_sec) * 1000L
+ (t2->tv_nsec - t1->tv_nsec) / 1000000L;
}
int main()
{
const long period_milli = 500;
struct timespec ts_last;
struct timespec ts_next;
const struct timespec ts_sleep = { 0, 1000000L };
clock_gettime( CLOCK_REALTIME, &ts_last );
while( 1 )
{
nanosleep( &ts_sleep, NULL );
clock_gettime( CLOCK_REALTIME, &ts_next );
long elapsed = elapsed_milli( &ts_last, &ts_next );
if( elapsed >= period_milli )
{
printf( "Elapsed : %ld\n", elapsed );
ts_last.tv_nsec += period_milli * 1000000L;
if( ts_last.tv_nsec >= 1000000000L )
{
ts_last.tv_nsec -= 1000000000L;
ts_last.tv_sec++;
}
}
}
return 0;
}
每过一次所需期间,“前一”时间都会被更新,以使用该期间经过的预期时间,而不是实际时间。这个例子在每次投票之间使用一个1ms的睡眠,这可能是过高的。
https://stackoverflow.com/questions/30700849
复制相似问题