#ifndef _THREAD_MESSAGETHREAD_HPP_ #define _THREAD_MESSAGETHREAD_HPP_ #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _THREAD_QUEUETHREAD_HPP_ #include #endif #ifndef _THREAD_MESSAGEQUEUE_HPP_ #include #endif #ifndef _THREAD_THREADCALLBACK_HPP_ #include #endif class MessageThread : private QueueThread { public: MessageThread(void); virtual ~MessageThread(); WORD postMessage(ThreadMessage &someThreadMessage); WORD sendMessage(ThreadMessage &someThreadMessage); WORD peekMessage(ThreadMessage &someThreadMessage); WORD messageCount(void); DWORD suspend(void); DWORD resume(void); DWORD wait(DWORD timeout)const; void stop(void); void isAlertable(WORD isAlertable); WORD insertHandler(PureThreadCallback *lpThreadCallback); void removeHandler(PureThreadCallback *lpThreadCallback); private: WORD getMessage(ThreadMessage &someThreadMessage); void dispatchMessage(ThreadMessage &someThreadMessage); void startup(void); void shutdown(void); void messageLoop(void); void removeHandlers(void); MessageQueue mMessageQueue; Mutex mMessageThreadMutex; Block mThreadCallback; }; inline WORD MessageThread::postMessage(ThreadMessage &someThreadMessage) { someThreadMessage.messageTime().refresh(); mMessageQueue.postMessage(someThreadMessage); return TRUE; } inline WORD MessageThread::sendMessage(ThreadMessage &someThreadMessage) { someThreadMessage.messageTime().refresh(); someThreadMessage.priority(ThreadMessage::PriorityHigh); postMessage(someThreadMessage); ::SleepEx(0,FALSE); // give up remainder of quantum so message can be processed return TRUE; } inline WORD MessageThread::getMessage(ThreadMessage &someThreadMessage) { return mMessageQueue.waitMessage(someThreadMessage); } inline WORD MessageThread::peekMessage(ThreadMessage &someThreadMessage) { return mMessageQueue.peekMessage(someThreadMessage); } inline WORD MessageThread::messageCount(void) { return mMessageQueue.itemsInQueue(); } inline DWORD MessageThread::suspend(void) { return QueueThread::suspend(); } inline DWORD MessageThread::resume(void) { return QueueThread::resume(); } inline DWORD MessageThread::wait(DWORD timeout)const { return QueueThread::wait(timeout); } inline void MessageThread::isAlertable(WORD isAlertable) { mMessageQueue.isAlertable(isAlertable); } #endif