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

-1
Walter White 3 Янв 2016 в 19:58

2 ответа

Лучший ответ

sleep_for на самом деле означает что-то вроде sleep_for_at_least. В ОС реального времени вы можете зависеть от ее пробуждения точно по запросу, но в обычной ОС она может спать на произвольное время дольше, чем указано.

Если вам нужна длительная синхронизация с настенными часами, вы обычно хотите вычислить, когда следующее пробуждение должно произойти математически (т. Е. Умножьте предполагаемую продолжительность на количество снов до настоящего момента, чтобы получить идеальное время пробуждения), и sleep_until в тот раз. Таким образом, каждое отдельное пробуждение может происходить с некоторым опозданием, но ошибка не накапливается от одного к другому. Вы можете сделать это, вычислив разницу между временем пробуждения и текущим временем, а затем используя sleep_for эту разницу, но это обычно приносит в жертву небольшую точность (время, затрачиваемое на все, что происходит после получения текущего времени), и дополнительную работу. , так как у вас еще есть возможность вычислить время следующего пробуждения.

2
Jerry Coffin 3 Янв 2016 в 17:04

Это ожидаемо. Сон - это сон на по крайней мере этот промежуток времени, а не точный планировщик, чтобы «сделать что-то в определенное время».

Вы не учитываете количество времени, которое требуется для фактического запуска вашего кода каждую секунду, или для пробуждения от сна, или для того, чтобы снова начать спать ... не говоря уже обо всех других вещах, которые ваш компьютер делает в это время. Некоторый дрейф - это нормально.

Вместо того, чтобы спать в течение 1 секунды, спите определенное количество микросекунд (может быть, 990 000?) В зависимости от того, сколько реального времени прошло с момента вашей последней «итерации». Следующее пробуждение снова может быть немного позднее, но, по крайней мере, это опоздание не будет кумулятивным, потому что ваш последующий аргумент о «сне» будет немного короче, чтобы компенсировать это.

Это лучший наивный планировщик, который вы получите.

2
Lightness Races in Orbit 3 Янв 2016 в 17:04