14 mCurrentMessage(NULL),
15 mStarted(false), mQuit(false)
24 }
catch (
const std::exception& e) {
25 std::cerr <<
"Exception in EventQueue destructor: " << e.what() << std::endl;
27 std::cerr <<
"Unknown exception in EventQueue destructor" << std::endl;
36 std::lock_guard<std::mutex> lock(iMutex);
39 auto insertPos = std::upper_bound(mQueue.begin(), mQueue.end(), whenUs,
41 return time < item.whenUs;
43 mQueue.emplace(insertPos, message, whenUs);
47 mQueueChanged.notify_one();
68 std::unique_lock<std::mutex> lk(iMutex);
72 if (!mQueue.empty()) {
77 if (mQueue.front().whenUs <= currentTime) {
78 auto item = std::move(mQueue.front());
89 auto result = mQueueChanged.wait_for(lk, std::chrono::milliseconds(500), [
this]{
91 return (!mQueue.empty() || mQuit);
98 if (poll_attempt >= 20) {
114 if (!mQueue.empty()) {
119 if (mQueue.front().whenUs <= currentTime) {
120 auto item = std::move(mQueue.front());
126 auto waitTime = mQueue.front().whenUs - currentTime;
129 if (waitTime > 500000) waitTime = 500000;
131 mQueueChanged.wait_for(lk, std::chrono::microseconds(waitTime));
147 return item->message;
157 std::lock_guard<std::mutex> lock(iMutex);
159 for (
const auto& item : mQueue) {
161 item.message->mHandler == h &&
162 item.message->what == what &&
163 (obj == NULL || item.message->obj == obj)) {
173 std::lock_guard<std::mutex> lock(iMutex);
176 mQueueChanged.notify_all();
181 auto now = std::chrono::steady_clock::now();
182 auto dur = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
Unified event queue supporting messages and functions with timed execution.
Promise class for asynchronous result handling with continuation chaining and type safety.
EventQueue()
Constructor - initializes empty queue.
std::optional< QueueItem > pollNext()
Poll for next ready queue item (unified interface)
int64_t uptimeMicros()
Get current system uptime in microseconds.
~EventQueue()
Destructor - cleanup remaining items.
std::shared_ptr< Message > poll()
Poll for next ready message (legacy compatibility)
@ MESSAGE
Traditional message with handler.
void quit()
Request queue shutdown.
bool hasMessage(const std::shared_ptr< Handler > &h, int32_t what, void *obj)
Check for specific message in queue.
bool isQuit()
Check if quit message was received.
bool enqueueMessage(const std::shared_ptr< Message > &message, int64_t whenUs)
Enqueue traditional message for timed execution.
Type-safe promise for asynchronous result handling with continuation chaining.
Software Timer namespace containing all timer-related classes.
Unified queue item supporting both messages and function tasks.