gpt4 book ai didi

c - 用 nanosleep 替换 usleep

转载 作者:行者123 更新时间:2023-12-02 05:50:49 25 4
gpt4 key购买 nike

我想在我的代码中用 nanosleep 替换过时的 usleep 函数:

static int timediff( struct timeval *large, struct timeval *small )
{
return ( ( ( large->tv_sec * 1000 * 1000 ) + large->tv_usec )
- ( ( small->tv_sec * 1000 * 1000 ) + small->tv_usec ) );
}

struct performance_s
{
struct timeval acquired_input;
};

performance_t *performance_new( int fieldtimeus )
{
performance_t *perf = malloc( sizeof( performance_t ) );
if( !perf ) return 0;

gettimeofday( &perf->acquired_input, 0 );

return perf;
}

performance_t *perf = 0;

int performance_get_usecs_since_frame_acquired( performance_t *perf )
{
struct timeval now;
gettimeofday( &now, 0 );
return timediff( &now, &perf->acquired_input );
}


int fieldtime = videoinput_get_time_per_field( norm );


if( rtctimer ) {
while( performance_get_usecs_since_frame_acquired( perf )
< ( (fieldtime*2) - (rtctimer_get_usecs( rtctimer ) / 2) ) ) {
rtctimer_next_tick( rtctimer );
}
} else {
int timeleft = performance_get_usecs_since_frame_acquired( perf );
if( timeleft < fieldtime )
usleep( fieldtime - timeleft );

问题:这个替换是否获得与 usleep 相同的精确计时(它是否是一个正确的替换)?
struct timespec delay = {0, ( fieldtime - timeleft )}; nanosleep(&delay, NULL);

最佳答案

原因之一usleep过时的是,当它被信号中断时的行为在历史系统中是不一致的。根据您的需要,这可能意味着您可以简单地替换为 nanosleep不是你想要的。特别是nanosleep执行任何信号处理程序时立即返回,即使信号处理程序是通过 SA_RESTART 安装的.因此,您可能想要执行以下操作:

while (nanosleep(&delay, &delay));

以节省剩余时间,如果它被中断并重新启动剩余时间的 sleep 。

另请注意 nanosleep用途 timespec ,以纳秒为单位,而不是微秒。因此,如果您的间隔值以微秒为单位,则必须将它们缩放 1000 以达到纳秒。

另外,请注意,传递小于 0 或大于 1000000000(1 秒)的纳秒值是错误(由 EINVAL 报告)。 timespec值必须“标准化”,即纳秒必须介于 0 和 999999999(含)之间,较大的值转换为使用结构的秒 ( tv_sec) 字段。

关于c - 用 nanosleep 替换 usleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com