async_message_queue.h
1 #pragma once 2 #include <queue> 3 #include <thread> 4 #include <mutex> 5 #include <condition_variable> 6 #include <string> 7 8 class AsyncMessageQueue 9 { 10 private: 11 std::mutex queue_mutex; 12 std::queue<std::wstring> message_queue; 13 std::condition_variable message_ready; 14 bool interrupted = false; 15 16 //Disable copy 17 AsyncMessageQueue(const AsyncMessageQueue&); 18 AsyncMessageQueue& operator=(const AsyncMessageQueue&); 19 20 public: 21 AsyncMessageQueue() 22 { 23 } 24 void queue_message(std::wstring message) 25 { 26 this->queue_mutex.lock(); 27 this->message_queue.push(message); 28 this->queue_mutex.unlock(); 29 this->message_ready.notify_one(); 30 } 31 std::wstring pop_message() 32 { 33 std::unique_lock<std::mutex> lock(this->queue_mutex); 34 while (message_queue.empty() && !this->interrupted) 35 { 36 this->message_ready.wait(lock); 37 } 38 if (this->interrupted) 39 { 40 //Just returns a empty string if the queue was interrupted. 41 return std::wstring(L""); 42 } 43 std::wstring message = this->message_queue.front(); 44 this->message_queue.pop(); 45 return message; 46 } 47 void interrupt() 48 { 49 this->queue_mutex.lock(); 50 this->interrupted = true; 51 this->queue_mutex.unlock(); 52 this->message_ready.notify_all(); 53 } 54 };