2#ifndef _aspose_system_threading_timer_queue_h 
    3#define _aspose_system_threading_timer_queue_h 
    5#include <system/threading/timer.h> 
    6#include <system/threading/thread_pool.h> 
    9#include <unordered_map> 
   13#include <condition_variable> 
   15namespace System { 
namespace Threading {
 
   37        std::lock_guard<std::mutex> __lock(m_mutex);
 
   38        m_timer_queue[timer] = 
true;
 
   48        std::lock_guard<std::mutex> __lock(m_mutex);
 
   49        m_timer_queue.erase(timer);
 
   60#pragma warning(disable: 4355) 
   63    TimerQueue() : is_worker_terminates(false), m_worker_thread(std::bind(&
TimerQueue::Worker, this)) {}
 
   71    static bool& GetInitialized();
 
   76    typedef std::unordered_map<Timer*, bool> Queue;
 
   80    bool is_worker_terminates;
 
   84    std::condition_variable m_cv;
 
   86    std::thread m_worker_thread;
 
   90    void Fire(
const Timer* t)
 
   98        using namespace std::chrono;
 
  100        system_clock::time_point time_point;
 
  101        std::unique_lock<std::mutex> m_lock(m_mutex);
 
  103        milliseconds fire_interval, duration;
 
  106            while (m_timer_queue.empty()) 
 
  108                if (is_worker_terminates)
 
  115            min = std::min_element(m_timer_queue.begin(), m_timer_queue.end(),
 
  116                [](
const Queue::value_type &t1, 
const Queue::value_type &t2) {
 
  117                    return std::get<0>(t1)->m_dueTime < std::get<0>(t2)->m_dueTime;
 
  121            if (m_timer_queue.size() == 1) 
 
  126            fire_interval = milliseconds(min->first->m_dueTime);
 
  127            time_point = system_clock::now() + fire_interval;
 
  129            m_cv.wait_until(m_lock, time_point);
 
  131            duration = duration_cast<milliseconds>(system_clock::now() - time_point) +  fire_interval;
 
  133            for (
auto i = m_timer_queue.begin(); i != m_timer_queue.end(); )
 
  135                if ((i->first->m_dueTime <= duration.count() && !i->second) ||  
 
  136                    i->first->m_dueTime == 0)                                   
 
  140                    if(i->first->m_period > 0)
 
  142                        i->first->m_dueTime = i->first->m_period;
 
  148                        i = m_timer_queue.erase(i);
 
  160                        i->first->m_dueTime -= duration.count();
 
static bool QueueUserWorkItem(WaitCallback callback)
Puts work item into queue which is present with callback with no parameter.
 
Timer class that executes job item in separate thread after delay. Objects of this class should only ...
Definition: timer.h:51
 
Queue that handles Timer objects. This is just an implementation. Timer objects register there by the...
Definition: timer_queue.h:22
 
static void JoinWorkerThread()
Joins worker thread. Waits infinitely if required.
 
static TimerQueue & GetInstance()
Implementation singleton.
 
bool Delete(Timer *timer)
Deletes timer from queue.
Definition: timer_queue.h:46
 
bool Add(Timer *timer)
Registers timer in queue.
Definition: timer_queue.h:35
 
TimerQueue(const TimerQueue &)=delete
No copying.
 
Definition: db_command.h:9