【问题标题】:How to make a while loop last for exactly 1 second in ansi C?如何在ansi C中使while循环持续1秒?
【发布时间】:2014-03-30 18:40:55
【问题描述】:

我尝试过这样的事情:

struct timeval time1,time2;
double time3,time4;
gettimeofday(&time1, NULL);
gettimeofday(&time2, NULL);
time3 = (time1.tv_sec + 1) * 1000000 + time1.tv_usec;
time4 = (time2.tv_sec)     * 1000000 + time2.tv_usec; 
while(time3 > time4){ 

    ...

    gettimeofday(&time2, NULL);
    time4 = (time2.tv_sec) * 1000000 + time2.tv_usec; 
}

但它并没有按照应有的方式工作。

【问题讨论】:

  • 您不应该使用睡眠的任何特殊原因? (linux.die.net/man/3/sleep)
  • “它没有按应有的方式工作” - 那么它以哪种方式工作?它持续不到1秒吗?超过 1 秒?有时少有时多?
  • 当心secs * 1000000 中的溢出。改用secs * 1000000.0
  • 那你为什么不只是等待它而不是循环。当前所有的操作系​​统都提供了在指定的超时时间内等待网络数据的方法。

标签: c time while-loop


【解决方案1】:

我怀疑你的问题是整数溢出。但是,确实没有必要使用双打。

使用timeval_subtract,如下所述:http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html

然后看看结果的tv_sec 分量是否非零。如果是这样,则已超过一秒。

另外,请不要调用您的变量time1time2time3time4。对于以后必须阅读您的代码的穷人来说,这非常令人困惑。建议starttimecurrenttime 或类似的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多