首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clock_Gettime()抖动?

Clock_Gettime()抖动?
EN

Stack Overflow用户
提问于 2015-06-08 03:28:04
回答 1查看 365关注 0票数 1

我在Linux2.6上使用clock_gettime() (从time.h)来控制线程循环中的计时。我需要500毫秒以内的+/- 5毫秒的时间。它似乎给了我500毫秒,然后开始漂移或抖动到+/- 30毫秒:

我正在使用CLOCK_REALTIME调用与它。有什么办法来改善它的偏差吗?我只是简单地数每一个mS与它和一旦计数器命中500火停止一个中断。

这也在QT4.3框架内。QTimer似乎比这更紧张。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-08 05:27:10

根据你问题的措辞,我觉得你可能是在错误地积累你的时间差异。

试试这种方法:

代码语言:javascript
运行
复制
#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的睡眠,这可能是过高的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30700849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档