我有一个在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);
}
答案 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)