Подключите asio io_context, чтобы мой собственный функтор вызывался для каждого обработчика завершения.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Подключите asio io_context, чтобы мой собственный функтор вызывался для каждого обработчика завершения.

Сообщение Anonymous »

Я работаю в системе, которая использует глобальный синглтон 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»