Я все еще плохо знаком с библиотеками, и документация, которую я могу найти на 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 с указанными часами / длительностью и установки его равным сейчас?
Самое простое, что вы можете сделать, это дать _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;
Других решений пока нет …