123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #pragma once
- #pragma warning(disable:4251)
- #include <mutex>
- #include <condition_variable>
- #include <queue>
- #include <memory>
- namespace ns_mess
- {
- struct MESSAGE_BASE
- {
- virtual ~MESSAGE_BASE()
- {}
- };
- template<typename Msg>
- struct wrapped_message :
- MESSAGE_BASE
- {
- Msg contents;
- explicit wrapped_message(Msg const& contents_) :
- contents(contents_)
- {}
- };
- class __declspec(dllexport) CMyQueue
- {
- std::mutex m_Mutex;
- std::condition_variable m_ConditionVariable;
- std::queue<std::shared_ptr<MESSAGE_BASE> > m_Queue;
- public:
- template<typename T>
- void PushToQueue(T const& msg)
- {
- std::lock_guard<std::mutex> lk(m_Mutex);
- m_Queue.push(std::make_shared<wrapped_message<T> >(msg));
- m_ConditionVariable.notify_all();
- }
- std::shared_ptr<MESSAGE_BASE> WaitMessage()
- {
- std::unique_lock<std::mutex> lk(m_Mutex);
- m_ConditionVariable.wait(lk, [&] {return !m_Queue.empty(); });
- auto res = m_Queue.front();
- m_Queue.pop();
- return res;
- }
- };
- }
|