Initial
This commit is contained in:
93
thread/MTHREAD.CPP
Normal file
93
thread/MTHREAD.CPP
Normal file
@@ -0,0 +1,93 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user