#include <iostream>
#include "current_time.h"
#include <time.h>
#include <future>
#include <chrono>
#include <Windows.h>
using namespace std;
current_time mytimer;
void timer()
{
while(true)
{
mytimer.operator++(); //incerements seconds
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
void(*foo)(void);
foo = &timer;
auto future = async(foo);
while (1)
{
Sleep(50);
system("cls");
mytimer.disp_time();
}
}
我的后台计时器并不准确。等了一段时间后,我发现它慢慢变得越来越晚了。我知道这是因为mytimer.operation ++()需要一些时间才能运行。我正在寻找修复,但我找不到任何修复。我目前正在使用VS15。
答案 0 :(得分:2)
sleep_for
实际上意味着sleep_for_at_least
。在实时操作系统上,您可能会在被要求时完全依赖它的唤醒,但在传统的操作系统上,它可以睡眠时间超过指定的任意时间。
如果您需要与挂钟进行长期同步,通常需要计算下次唤醒何时应以数学方式进行(即,将预期持续时间乘以目前的睡眠次数以获得理想的唤醒时间),sleep_until
那个时间。这样每次单次唤醒可能会稍晚,但错误不会从一个到另一个累积。你可以通过计算唤醒时间和当前时间之间的差异来做到这一点,然后我们sleep_for
那个差异,但这通常会牺牲一点准确性(获得当前时间之后所有事情所花费的时间)和额外的工作,因为你仍然有计算下一个唤醒时间。
答案 1 :(得分:2)
这是预期的。睡眠是至少那段时间的睡眠,而不是“在特定时间做事”的精确调度程序。
你没有考虑每秒实际运行代码,从睡眠中唤醒或重新开始睡眠所需的时间。更不用说你的计算机在此期间所做的所有其他事情了。有些漂移是正常的。
根据自上次“迭代”以来经过的实际时间,而不是睡眠1秒钟,睡眠一定数量的微秒(990,000可能?)。下一次唤醒可能会稍晚一些,但至少迟到不会累积,因为随后的“睡眠”论点会稍微缩短以补偿。
这是你会得到的最好的天真调度程序。