From 1a00c83c7baef38e319ac81f925730d384c7a46e Mon Sep 17 00:00:00 2001 From: casey langen Date: Wed, 21 Dec 2016 00:02:20 -0800 Subject: [PATCH] Added MessageQueue::WaitAndDispatch(), which should be usable for timer-like functionality. --- src/musikbox/cursespp/MessageQueue.cpp | 20 ++++++++++++++++++++ src/musikbox/cursespp/MessageQueue.h | 3 +++ 2 files changed, 23 insertions(+) diff --git a/src/musikbox/cursespp/MessageQueue.cpp b/src/musikbox/cursespp/MessageQueue.cpp index 3ea9c50cc..6f5376538 100755 --- a/src/musikbox/cursespp/MessageQueue.cpp +++ b/src/musikbox/cursespp/MessageQueue.cpp @@ -45,6 +45,20 @@ MessageQueue::MessageQueue() { } +void MessageQueue::WaitAndDispatch() { + LockT lock(this->queueMutex); + + if (this->queue.size()) { + auto next = system_clock::now().time_since_epoch() - this->queue.front()->time; + waitForDispatch.wait_for(lock, next); + } + else { + waitForDispatch.wait(lock); + } + + this->Dispatch(); +} + void MessageQueue::Dispatch() { milliseconds now = duration_cast( system_clock::now().time_since_epoch()); @@ -131,7 +145,13 @@ void MessageQueue::Post(IMessagePtr message, int64 delayMs) { } } + bool first = (curr == this->queue.begin()); + this->queue.insert(curr, m); + + if (first) { + this->waitForDispatch.notify_all(); + } } void MessageQueue::Debounce(IMessagePtr message, int64 delayMs) { diff --git a/src/musikbox/cursespp/MessageQueue.h b/src/musikbox/cursespp/MessageQueue.h index d5394e8b7..1dfe66f55 100755 --- a/src/musikbox/cursespp/MessageQueue.h +++ b/src/musikbox/cursespp/MessageQueue.h @@ -38,6 +38,7 @@ #include "IMessageTarget.h" #include +#include #include namespace cursespp { @@ -49,6 +50,7 @@ namespace cursespp { void Remove(IMessageTarget *target, int type = -1); void Debounce(IMessagePtr message, int64 delayMs = 0); + void WaitAndDispatch(); void Dispatch(); private: @@ -59,6 +61,7 @@ namespace cursespp { std::recursive_mutex queueMutex; std::list queue; + std::condition_variable_any waitForDispatch; void Dispatch(IMessagePtr message); };