【问题标题】:C++ inaccurate timerC++ 不准确的计时器
【发布时间】:2016-01-03 16:58:21
【问题描述】:
#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。

【问题讨论】:

  • 您是否考虑过将其与系统时钟同步,而不是只计算秒数?
  • current_time 实际上是什么?
  • A time counter in c++的可能重复

标签: c++ asynchronous timer chrono


【解决方案1】:

sleep_for 的真正含义类似于sleep_for_at_least。在实时操作系统上,您可能能够依赖于它在被询问时准确地唤醒,但在传统操作系统上,它可以休眠超过指定时间的任意时间。

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

【讨论】:

    【解决方案2】:

    这是意料之中的。睡眠是在至少这段时间内的睡眠,而不是“在特定时间做某事”的精确调度程序。

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

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

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

    【讨论】:

    • 问题在于 1 次迭代的时间并不总是恒定的。
    • @WalterWhite:所以?你必须测量实时。如前所述,每次无论如何都会有所不同。这就是重点!
    • @WalterWhite:很抱歉你觉得我的回答对你没有帮助。
    • 它确实帮助了我。我感谢每一个答案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多