27 #ifndef MESSAGEQUEUETHREAD 28 #define MESSAGEQUEUETHREAD 34 #include <boost/throw_exception.hpp> 67 template <
typename MessageId,
typename MessageType>
99 : m_msgIdDecoder{messageIdDecoder}
100 , m_destroyOptions{destroyOptions}
101 , m_messageDeleter{messageDeleter}
105 BOOST_THROW_EXCEPTION(std::runtime_error(
"ThreadBase::Start() returned false"));
121 while (!m_messageQueue.Empty())
123 switch (m_destroyOptions)
126 ProcessNextMessage();
154 std::lock_guard<std::mutex> lock{m_mutex};
156 if (m_msgHandlerMap.count(messageID) > 0)
158 BOOST_THROW_EXCEPTION(std::runtime_error(
"message handler already defined"));
161 m_msgHandlerMap.emplace(messageID, messageHandler);
169 m_messageQueue.Push(std::forward<MessageType>(msg));
176 ProcessNextMessage();
182 m_messageQueue.BreakPopWait();
189 if (!m_messageQueue.Pop(msg))
198 MessageId messageId{m_msgIdDecoder(msg)};
199 std::lock_guard<std::mutex> lock{m_mutex};
201 if (m_msgHandlerMap.count(messageId) > 0)
203 canDeleteMsg = m_msgHandlerMap[messageId](msg);
215 if (canDeleteMsg && m_messageDeleter)
219 m_messageDeleter(msg);
232 if (!m_messageQueue.Pop(msg))
239 if (m_messageDeleter)
241 m_messageDeleter(msg);
270 #endif // MESSAGEQUEUETHREAD std::mutex m_mutex
Definition: MessageQueueThread.h:252
std::map< MessageId, msg_handler_t > msg_map_t
Typedef for message map type.
Definition: MessageQueueThread.h:260
Thread base class.
Definition: ThreadBase.h:49
MessageQueueThread(const msg_id_decoder_t &messageIdDecoder, eOnDestroyOptions destroyOptions=eOnDestroyOptions::ignoreRemainingItems, const msg_deleter_t &messageDeleter=msg_deleter_t())
Default constructor.
Definition: MessageQueueThread.h:95
File containing declaration of ThreadBase class.
File containing concurrent queue declaration.
The core_lib namespace.
Definition: AsioDefines.h:59
std::function< void(MessageType &)> msg_deleter_t
Typedef defining message deleter function.
Definition: MessageQueueThread.h:84
void ProcessTerminationConditions() NO_EXCEPT_ override
Perform any special termination actions.
Definition: MessageQueueThread.h:179
~MessageQueueThread() override
Destructor.
Definition: MessageQueueThread.h:117
void Push(MessageType &&msg)
Push a message as an array of items onto this thread's queue.
Definition: MessageQueueThread.h:167
eOnDestroyOptions
Control how messages get destroyed in destructor.
Definition: MessageQueueThread.h:46
void ProcessNextMessage()
Process next message.
Definition: MessageQueueThread.h:185
std::function< bool(MessageType &)> msg_handler_t
Typedef defining message handler functor.
Definition: MessageQueueThread.h:143
void DeleteNextMessage()
Delete next message.
Definition: MessageQueueThread.h:228
void ThreadIteration() NO_EXCEPT_ override
Execute a single iteration of the thread.
Definition: MessageQueueThread.h:174
void RegisterMessageHandler(MessageId const &messageID, msg_handler_t const &messageHandler)
Register a function to handle a particular message.
Definition: MessageQueueThread.h:152
std::function< MessageId(const MessageType &)> msg_id_decoder_t
Typedef defining message ID decoder function.
Definition: MessageQueueThread.h:77
Message Queue Thread.
Definition: MessageQueueThread.h:68