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