C ++中的延迟循环输出

时间:2010-05-04 18:49:57

标签: c++ delay timing

我有一个在do while循环中运行的while循环。我需要while循环才能正好每秒运行一次没有更快,不慢。但我不知道我会怎么做。这是循环,关闭它自己的功能。我听说过sleep()函数,但我也听说它不是很准确。

int min5()
{
    int second = 00;
    int minute = 0;
    const int ZERO = 00;

    do{
        while (second <= 59){
        if(minute == 5) break;
        second += 1;
        if(second == 60) minute += 1;
        if(second == 60) second = ZERO;
        if(second < 60) cout << "Current Time> "<< minute <<" : "<< second <<" \n";
        }
      } while (minute <= 5);
}

5 个答案:

答案 0 :(得分:4)

您可以通过使用操作系统(OS)功能获得最佳准确度。您需要找到也具有回调功能的API。 回调函数是您编写的函数,当计时器到期时,操作系统将调用该函数。

请注意,由于程序执行时正在运行的其他任务和活动,操作系统可能会失去计时精度。

答案 1 :(得分:3)

如果您需要便携式解决方案,则不应期望高精度计时。通常,您只能使用依赖于平台的解决方案。

一个便携式(虽然效率不高,也不是特别优雅)的解决方案可以使用类似这样的功能:

#include <ctime>

void wait_until_next_second()
{
    time_t before = time(0);
    while (difftime(time(0), before) < 1);
}

然后你可以在你的函数中使用它:

int min5()
{
    wait_until_next_second();  // synchronization (optional), so that the first
                               // subsequent call will not take less than 1 sec.
    ...
    do
    {
        wait_until_next_second();  // waits approx. one second
        while (...)
        {
            ...
        }
    } while (...)
}

对您的代码的进一步评论:

  • 一旦minute达到值5,您的代码就会陷入无限循环。

  • 您是否知道00表示八进制(基数8)数字(由于前导零)?在这种情况下无关紧要,但要注意017等数字。这是小数15,而不是17!

  • 您可以将seconds++权限合并到while循环的条件中:while (seconds++ <= 59) ...

  • 我认为在这种情况下,最好将endl插入cout流,因为这会刷新它,而插入"\n"则不会刷新流。这并不重要,但你的意图似乎是始终在cout看到当前时间;如果你不刷新流,你实际上并不能保证立即看到时间消息。

答案 2 :(得分:1)

例如,在Windows中,可以创建一个可等待的计时器对象。

如果那是您的操作系统,请查看此处的文档,例如Waitable Timer Objects

从您提供的代码看起来,您尝试做的事情可以通过睡眠轻松完成。保证你的循环体每1秒执行一次是没有意义的。而是让它每秒执行10次并检查上一次经过的时间,你采取了一些行动,是否超过一秒钟。如果没有,什么也不做。如果是,请执行操作(打印您的消息,增加变量等),存储上次操作的时间并再次循环。

答案 3 :(得分:1)

正如其他人发布的那样,您的操作系统可能会提供某种警报或计时器功能。你应该尝试使用这种东西,而不是编写自己的轮询循环。轮询时间意味着您需要每秒都进行上下文切换,这样可以在系统执行其他操作时保持代码运行。在这种情况下,你打断其他人300次只是为了说“我们还没完成”。

此外,你永远不应该假设睡眠的持续时间 - 即使你有一个实时操作系统,这也是不安全的 - 你应该总是询问实时时钟或滴答计数器每次经过多少时间,否则任何错误都会累积,因此随着时间的推移会越来越准确。即使在实时系统上也是如此,因为即使实时系统可以准确地睡眠1秒,代码也需要一些时间才能运行,因此这个定时误差会在每次循环中累积。

答案 4 :(得分:0)

相关问题