message.hpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #pragma once
  2. #pragma warning(disable:4251)
  3. #include <mutex>
  4. #include <condition_variable>
  5. #include <queue>
  6. #include <memory>
  7. namespace ns_mess
  8. {
  9. struct MESSAGE_BASE
  10. {
  11. virtual ~MESSAGE_BASE()
  12. {}
  13. };
  14. template<typename Msg>
  15. struct wrapped_message :
  16. MESSAGE_BASE
  17. {
  18. Msg contents;
  19. explicit wrapped_message(Msg const& contents_) :
  20. contents(contents_)
  21. {}
  22. };
  23. class __declspec(dllexport) CMyQueue
  24. {
  25. std::mutex m_Mutex;
  26. std::condition_variable m_ConditionVariable;
  27. std::queue<std::shared_ptr<MESSAGE_BASE> > m_Queue;
  28. public:
  29. template<typename T>
  30. void PushToQueue(T const& msg)
  31. {
  32. std::lock_guard<std::mutex> lk(m_Mutex);
  33. m_Queue.push(std::make_shared<wrapped_message<T> >(msg));
  34. m_ConditionVariable.notify_all();
  35. }
  36. std::shared_ptr<MESSAGE_BASE> WaitMessage()
  37. {
  38. std::unique_lock<std::mutex> lk(m_Mutex);
  39. m_ConditionVariable.wait(lk, [&] {return !m_Queue.empty(); });
  40. auto res = m_Queue.front();
  41. m_Queue.pop();
  42. return res;
  43. }
  44. };
  45. }