94 lines
2.1 KiB
C++
94 lines
2.1 KiB
C++
#include <thread/mthread.hpp>
|
|
|
|
MessageThread::MessageThread(bool startup)
|
|
: mMessageThreadMutex("MessageThreadMutex")
|
|
{
|
|
if(startup)start();
|
|
}
|
|
|
|
MessageThread::~MessageThread()
|
|
{
|
|
stop();
|
|
}
|
|
|
|
void MessageThread::stop(void)
|
|
{
|
|
ThreadMessage threadMessage(ThreadMessage::TM_DESTROY,0L,0L,ThreadMessage::PriorityHigh);
|
|
|
|
if(!isRunning())return;
|
|
QueueThread::stop();
|
|
resume();
|
|
sendMessage(threadMessage);
|
|
removeHandlers();
|
|
wait(INFINITE);
|
|
mMessageQueue.shutdownQueue();
|
|
}
|
|
|
|
WORD MessageThread::insertHandler(PureThreadCallback *lpThreadCallback)
|
|
{
|
|
WORD returnCode;
|
|
|
|
mMessageThreadMutex.requestMutex();
|
|
mThreadCallback.insert(&ThreadCallbackPointer(lpThreadCallback));
|
|
returnCode=mThreadCallback.size();
|
|
mMessageThreadMutex.releaseMutex();
|
|
return returnCode;
|
|
}
|
|
|
|
void MessageThread::removeHandler(PureThreadCallback *lpThreadCallback)
|
|
{
|
|
size_t itemCount;
|
|
|
|
mMessageThreadMutex.requestMutex();
|
|
itemCount=(size_t)mThreadCallback.size();
|
|
for(short vectorIndex=0;vectorIndex<itemCount;vectorIndex++)
|
|
{
|
|
if(mThreadCallback[vectorIndex]==ThreadCallbackPointer(lpThreadCallback))
|
|
{
|
|
mThreadCallback.remove(vectorIndex);
|
|
itemCount=(size_t)mThreadCallback.size();
|
|
vectorIndex=-1;
|
|
}
|
|
}
|
|
mMessageThreadMutex.releaseMutex();
|
|
}
|
|
|
|
void MessageThread::removeHandlers(void)
|
|
{
|
|
mMessageThreadMutex.requestMutex();
|
|
mThreadCallback.remove();
|
|
mMessageThreadMutex.releaseMutex();
|
|
}
|
|
|
|
void MessageThread::dispatchMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
size_t itemCount;
|
|
|
|
mMessageThreadMutex.requestMutex();
|
|
itemCount=(size_t)mThreadCallback.size();
|
|
for(short vectorIndex=0;vectorIndex<itemCount;vectorIndex++)
|
|
mThreadCallback[vectorIndex].callback(someThreadMessage);
|
|
mMessageThreadMutex.releaseMutex();
|
|
}
|
|
|
|
// *** virtual overload of QueueMessage
|
|
|
|
void MessageThread::startup(void)
|
|
{
|
|
ThreadMessage threadMessage(ThreadMessage::TM_CREATE,0L);
|
|
sendMessage(threadMessage);
|
|
}
|
|
|
|
void MessageThread::messageLoop(void)
|
|
{
|
|
ThreadMessage threadMessage;
|
|
|
|
while(isRunning())if(mMessageQueue.waitMessage(threadMessage))dispatchMessage(threadMessage);
|
|
}
|
|
|
|
void MessageThread::shutdown(void)
|
|
{
|
|
return;
|
|
}
|
|
|