У меня много примеров std::this_thread::sleep_for(remaining_loop_time_duration)
.
Чтобы ускорить симуляцию, нас теперь попросили использовать специальную пользовательскую ссылку на часы (запрашиваемую с помощью GetSimTime
), которая работает быстрее, чем в реальном времени, в коэффициент > 1,0.
Чтобы избежать большой реструктуризации моего кода, я просто хочу использовать такие собственные часы:
struct speedy_clock {
using duration = std::chrono::microseconds;
using rep = duration::rep;
using period = duration::period;
using time_point = std::chrono::time_point<motion_clock>;
static const bool is_steady = false;
static time_point now() noexcept {
SimTime time;
GetSimTime(&time);
unsigned int seconds_since_epoch = time.Seconds;
unsigned int microseconds_within_second = time.USec;
std::chrono::seconds seconds_duration(seconds_since_epoch);
std::chrono::microseconds microseconds_duration(microseconds_within_second);
// Calculate the total duration
std::chrono::microseconds total_duration = seconds_duration + microseconds_duration;
return ans_motion_util::motion_clock::time_point(total_duration);
}
};
Моя цель, конечно, состоит в том, чтобы все экземпляры std::this_thread::sleep_for()
сна с учетом ускоренного времени GetSimTime
предоставлялись через мой speedy_clock
. Это выполнимо или мне нужно написать свою собственную версию сна?
Кажется, вы хотите std::this_thread::sleep_for
сделать что-то, для чего оно не предназначено. Если вам нужно индивидуальное поведение, ваш код должен вызывать специальную функцию sleep
.
Типичная реализация будет вызывать ОС, например. DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable);
в Windows. Это вообще не касается вашего GetSimTime
.
Вместо speedy_clock
вы, вероятно, могли бы заменить nanosleep
(или что-то еще, что используется внутри вашей реализации) своей собственной функцией.
Боюсь, вам придется написать собственную функцию сна. std::this_thread::sleep_for
спит на std::chrono::duration
. А std::chrono::duration
совершенно не знает о существовании часов:
template <class Rep, class Period = ratio<1>>
class duration
{
Rep count_;
public:
duration() = default;
// ...
};
Стандартная библиотека не позволяет выбрать другие часы для
sleep
функций. Я бы предпочел рассчитать продолжительность различных временных интервалов и передать их или (если это своего рода таймер) создать инъекционный таймер, который можно будет отметить вручную для тестирования.