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" 参数会稍微短一些以补偿。
这是您将获得的最简单的调度程序。
#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" 参数会稍微短一些以补偿。
这是您将获得的最简单的调度程序。