#pragma once #include #include #include #include template class SimpleTimer { public: SimpleTimer(unsigned int duration, std::function const& _call_back) : is_running_(true), call_back(_call_back), _deadline_timer(_ios, Duration(duration)) { _deadline_timer.async_wait( [&](boost::system::error_code const& e) { if (e.value() == boost::asio::error::operation_aborted) { return; } if (is_running_.load(std::memory_order_relaxed)) { call_back(); } } ); _thread = std::thread([this] { _ios.run(); }); } ~SimpleTimer() { Stop(); } void Stop() { is_running_.store(false, std::memory_order_relaxed); _ios.stop(); if (_thread.joinable()) { _thread.join(); } } private: std::atomic_bool is_running_; std::function call_back; boost::asio::io_context _ios; boost::asio::deadline_timer _deadline_timer; std::thread _thread; };