Files
Work/thread/MTHREAD.CPP
2024-08-07 09:16:27 -04:00

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;
}