Я работаю в системе, которая использует глобальный синглтон Clock для хранения текущего времени.
class Clock
{
public:
static Clock& instance()
{
static Clock clock;
return clock;
}
std::chrono::sys_time time;
};
Каждый раз, когда происходит асинхронное событие, текущее время обновляется.
void onEventFoo()
{
Clock::instance().time = std::chrono::system_clock::now();
}
Я добавляю некоторую поддержку asio.
У меня есть класс EventLoop, который оборачивает boost::asio::io_context.
Я хотел бы «подключить» io_context, чтобы всякий раз, когда выполняется какой-либо обработчик завершения для асинхронного события, он обновлял мой глобальный часы.
Например (псевдокод):
template
void execute(Func&& func, Args&&... args)
{
Clock::instance().time = std::chrono::system_clock::now();
std::forward(func)(std::forward(args)...);
}
Ниже у меня есть пример кода, который оборачивает boost::asio::system_timer, а в обратном вызове async_wait он вручную вызывает мою функцию выполнения, чтобы глобальное время обновлялось.
Я хотел бы знать, как сделать так, чтобы моя функция выполнения автоматически вызывалась asio для каждого обработчика завершения, а не чтобы вручную вызвать его в каждом обработчике завершения.
Возможно ли это?
Полный пример кода ниже:
#include
#include
#include
#include
class Clock
{
public:
static Clock& instance()
{
static Clock clock;
return clock;
}
std::chrono::sys_time time;
};
class EventLoop
{
public:
void run()
{
ctx.run();
}
template
void execute(Func&& func, Args&&... args)
{
Clock::instance().time = std::chrono::system_clock::now();
std::forward(func)(std::forward(args)...);
}
boost::asio::io_context ctx;
};
class Timer
{
public:
using TimerCb = std::function;
Timer(EventLoop& loop, TimerCb cb)
: timer_(loop.ctx)
, loop_(loop)
, cb_(cb)
{}
void wait(std::chrono::seconds wait)
{
timer_.expires_after(wait);
timer_.async_wait(std::bind_front(&Timer::onTimer, this));
}
private:
void onTimer(boost::system::error_code)
{
loop_.execute(cb_); // here I have to manually call `loop.execute`
// cb_();
}
boost::asio::system_timer timer_;
EventLoop& loop_;
TimerCb cb_;
};
int main(int argc, char** argv)
{
Clock::instance().time = std::chrono::system_clock::now();
EventLoop loop;
std::cout
Подробнее здесь: https://stackoverflow.com/questions/798 ... tion-handl