C ++不准确的计时器

时间:2016-01-03 16:58:21

标签: c++ asynchronous timer chrono

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

2 个答案:

答案 0 :(得分:2)

sleep_for实际上意味着sleep_for_at_least。在实时操作系统上,您可能会在被要求时完全依赖它的唤醒,但在传统的操作系统上,它可以睡眠时间超过指定的任意时间。

如果您需要与挂钟进行长期同步,通常需要计算下次唤醒何时应以数学方式进行(即,将预期持续时间乘以目前的睡眠次数以获得理想的唤醒时间),sleep_until那个时间。这样每次单次唤醒可能会稍晚,但错误不会从一个到另一个累积。你可以通过计算唤醒时间和当前时间之间的差异来做到这一点,然后我们sleep_for那个差异,但这通常会牺牲一点准确性(获得当前时间之后所有事情所花费的时间)和额外的工作,因为你仍然有计算下一个唤醒时间。

答案 1 :(得分:2)

这是预期的。睡眠是至少那段时间的睡眠,而不是“在特定时间做事”的精确调度程序。

你没有考虑每秒实际运行代码,从睡眠中唤醒或重新开始睡眠所需的时间。更不用说你的计算机在此期间所做的所有其他事情了。有些漂移是正常的。

根据自上次“迭代”以来经过的实际时间,而不是睡眠1秒钟,睡眠一定数量的微秒(990,000可能?)。下一次唤醒可能会稍晚一些,但至少迟到不会累积,因为随后的“睡眠”论点会稍微缩短以补偿。

这是你会得到的最好的天真调度程序。