#pragma once #include #include #include #include namespace QuickMedia { template class MessageQueue { public: MessageQueue() : running(true) { } void push(T data) { std::unique_lock lock(mutex); data_queue.push_back(std::move(data)); cv.notify_one(); } std::optional pop_wait() { std::unique_lock lock(mutex); if(!running) return std::nullopt; while(data_queue.empty() && running) cv.wait(lock); if(!running) return std::nullopt; T data = std::move(data_queue.front()); data_queue.pop_front(); return data; } void close() { std::unique_lock lock(mutex); running = false; cv.notify_one(); } void clear() { std::unique_lock lock(mutex); data_queue.clear(); } private: std::deque data_queue; std::mutex mutex; std::condition_variable cv; bool running; }; }