hproselet/timer.hpp

47 lines
1.1 KiB
C++

#ifndef _TIMER_HPP_
#define _TIMER_HPP_
#include <functional>
#ifndef ASIO_STANDALONE
#define ASIO_STANDALONE
#endif
#include <asio.hpp>
using timer_callback = std::function<void()>;
class Timer : public std::enable_shared_from_this<Timer> {
public:
Timer(asio::io_context& ctx, const timer_callback& cb, uint32_t wait, uint32_t interval) :
callback(cb),
interval(interval),
timer(ctx, asio::chrono::milliseconds(wait)) {}
void Begin() {
timer.async_wait([this, self = shared_from_this()](const asio::error_code& ec) {
if(ec)
return;
if(callback)
callback();
if(interval > 0)
std::make_shared<Timer>(timer.get_io_context(), callback, interval, interval)->Begin();
});
}
void Cancel() {
timer.cancel();
}
protected:
timer_callback callback;
uint32_t interval;
asio::steady_timer timer;
};
class TimerService {
public:
virtual std::weak_ptr<Timer> AddTimer(const timer_callback& cb, uint32_t wait, uint32_t interval) = 0;
};
#endif