24 #include <condition_variable> 
   32 template<
class Signature, 
class Function = std::function<Signature>>
 
   34     typedef std::chrono::system_clock TimerClock;
 
   37         timerName_(timerName), isThreadRun_(false), isTimerRun_(false), callback_([]{})
 
   46         if (isThreadRun_ && timerThread_.joinable()) {
 
   47             std::unique_lock<std::mutex> timerLock(timerGuard_);
 
   50             condition_.notify_one();
 
   58     void start(std::size_t seconds, 
const Function& callback)
 
   63         std::unique_lock<std::mutex> timerLock(timerGuard_);
 
   67             timerThread_ = std::thread([&] { run(); });
 
   71             endTS_ = TimerClock::now() + std::chrono::seconds(seconds);
 
   74             condition_.notify_one();
 
   80         std::unique_lock<std::mutex> timerLock(timerGuard_);
 
   84             condition_.notify_one();
 
   91         std::unique_lock<std::mutex> timerLock(timerGuard_);
 
   93         while (isThreadRun_) {
 
   95                 auto now = TimerClock::now();
 
   99                     auto currentCallback = callback_;
 
  107                     condition_.wait_for(timerLock, (endTS_ - now));
 
  110                 condition_.wait(timerLock);
 
  116     const std::string timerName_;
 
  121     std::thread timerThread_;
 
  122     std::condition_variable condition_;
 
  124     std::mutex timerGuard_;
 
  126     std::chrono::time_point<TimerClock> endTS_;
 
KaaTimer(const std::string &timerName)
 
void start(std::size_t seconds, const Function &callback)