C++ 不准确的定时器

C++ inaccurate timer

#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。

sleep_for 的实际意思类似于 sleep_for_at_least。在实时 OS 中,您可以依赖它在被要求时准确唤醒,但在传统 OS 中,它可以休眠比指定时间更长的任意时间。

如果您需要 long-term 与挂钟同步,您通常需要计算下一次 wake-up 应该在数学上发生的时间(即,将预期持续时间乘以到目前为止的睡眠次数以获得理想的唤醒时间)和 sleep_until 那个时间。这样,每次唤醒可能会有点晚,但错误不会从一个到下一个累积。您可以通过计算唤醒时间和当前时间之间的差异,然后我们 sleep_for 那个差异来做到这一点,但这通常会牺牲一点准确性(获取当前时间之后的所有时间所花费的时间)和额外的工作,因为您在下一次唤醒时间仍然有计算。

这是意料之中的。睡眠是 至少 的睡眠时间,而不是 "do a thing at a specific time".

的精确调度程序

您没有考虑每秒实际 运行 您的代码、从睡眠中醒来或再次开始睡眠所花费的时间。更不用说计算机的所有其他事情了同时正在做。有些漂移是正常的。

不是休眠 1 秒,而是休眠一定数量的微秒(可能是 990,000?),这取决于自上次 "iteration" 以来实际流逝的时间。下一次唤醒可能会再次稍晚,但至少不会累积迟到,因为您随后的 "sleep" 参数会稍微短一些以补偿。

这是您将获得的最简单的调度程序。