Я работаю в системе, которая использует глобальный синглтон 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
Подключите asio io_context, чтобы мой собственный функтор вызывался для каждого обработчика завершения. ⇐ C++
Программы на C++. Форум разработчиков
1761574502
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79801910/hook-asio-io-context-so-that-my-own-functor-is-called-for-every-completion-handl[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия