std :: chrono :: time_point установлен на сейчас

Я все еще плохо знаком с библиотеками, и документация, которую я могу найти на std :: chrono, не работает для меня.

Я пытаюсь реализовать контейнер объектов, которые содержат метки времени. Все объекты будут храниться в порядке от самого последнего до наименее недавнего, и я решил попробовать использовать точку std :: chrono :: time_point для представления каждой отметки времени. Поток, который обрабатывает данные, периодически просыпается, обрабатывает данные, смотрит, когда ему нужно снова проснуться, а затем дремлет в течение этой продолжительности.

static std::chrono::time_point<std::chrono::steady_clock, std::chrono::milliseconds> _nextWakeupTime;

У меня сложилось впечатление, что в приведенном выше заявлении используются постоянные часы с точностью до миллисекунды.

Следующим шагом является установка _nextWakeupTime для представления now;

_nextWakeupTime = time_point_cast<milliseconds>(steady_clock::now());

Эта строка не скомпилируется:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::chrono::time_point<_Clock,_Duration>' (or there is no acceptable conversion)
with
[
_Clock=std::chrono::system_clock,
_Duration=std::chrono::milliseconds
]
chrono(298): could be 'std::chrono::time_point<_Clock,_Duration> &std::chrono::time_point<_Clock,_Duration>::operator =(const std::chrono::time_point<_Clock,_Duration> &)'
with
[
_Clock=std::chrono::steady_clock,
_Duration=std::chrono::milliseconds
]
while trying to match the argument list '(std::chrono::time_point<_Clock,_Duration>, std::chrono::time_point<_Clock,_Duration>)'
with
[
_Clock=std::chrono::steady_clock,
_Duration=std::chrono::milliseconds
]
and
[
_Clock=std::chrono::system_clock,
_Duration=std::chrono::milliseconds
]

Я понимаю, что в системах Windows stead_clock — это то же самое, что system_clock, но я не знаю, что здесь происходит. Я знаю, что мог сделать это:

_nextWakeupTime += _nextWakeupTime.time_since_epoch();

Я просто не чувствую, что это хорошее представление о том, что я должен делать.


В том же духе, каков наилучший способ создания экземпляра объекта time_point с указанными часами / длительностью и установки его равным сейчас?

4

Решение

Самое простое, что вы можете сделать, это дать _nextWakeupTime тип steady_clock::time_point,

steady_clock::time_point _nextWakeupTime;

Вы можете запросить, какое разрешение этого time_point это с steady_clock::time_point::periodгде это дает вам std::ratio со статическими членами num а также den,

typedef steady_clock::time_point::period resolution;
cout << "The resolution of steady_clock::time_point is " << resolution::num
<< '/' <<resolution::den << " of a second.\n";

Из ваших сообщений об ошибках следует, что ваш поставщик сделал system_clock::time_point а также steady_clock::time_point тот же самый time_point и, таким образом, они разделяют одну и ту же эпоху, и вы можете смешать их в арифметике. Чтобы разобраться в этой ситуации, вы можете запросить time_pointЧасы с:

time_point::clock

То есть в вашей реализации steady_clock::time_point::clock не steady_clock но system_clock, Если вы действительно хотите time_point это совместимо с steady_clock::time_point но с миллисекундным разрешением вы можете сделать это:

time_point<steady_clock::time_point::clock, milliseconds> _nextWakeupTime;
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]