| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #include "StdAfx.h"
- #include "MessagePumpThread.h"
- CMessagePumpThread::CMessagePumpThread(void)
- {
- }
- CMessagePumpThread::~CMessagePumpThread(void)
- {
- }
- UINT CMessagePumpThread::MessagePumpThread(void* thisptr)
- {
- CMessagePumpThread *threadClass = (CMessagePumpThread*)thisptr;
- threadClass->RunMessagePump();
- return 0;
- }
- void CMessagePumpThread::Start()
- {
- m_hEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
- m_thread = _beginthreadex(NULL, 0, MessagePumpThread, this, 0, &m_threadID);
- if (0 == m_thread)
- {
- throw "Could not create thread";
- }
- // now wait until the thread is up and really running
- if (WAIT_OBJECT_0 != WaitForSingleObject(m_hEvt, 10000L)) // 10 seconds
- {
- throw "Timeout waiting for thread to start";
- }
- }
- void CMessagePumpThread::Stop()
- {
- PostThreadMessage(m_threadID, WM_QUIT, 0, 0L);
- if (WAIT_OBJECT_0 != WaitForSingleObject(m_hEvt, 10000L))
- {
- throw "Timeout waiting for thread to stop";
- }
- };
- void CMessagePumpThread::PostMsg(UINT msg, WPARAM wParam, LPARAM lParam)
- {
- PostThreadMessage(m_threadID, msg, wParam, lParam);
- }
- void CMessagePumpThread::RunMessagePump()
- {
- MSG msg;
- // create the message queue
- PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
- // we're far enough to let the creator know we're running
- SetEvent(m_hEvt);
- while(true)
- {
- BOOL bRet = GetMessage(&msg, NULL, 0, 0);
- if (0 >= bRet) // just read the specs, it's a "MickeySoft BOOL" and can be TRUE, FALSE or -1 (right on)
- {
- SetEvent(m_hEvt);
- break;
- }
- TakeMsg(msg.message, msg.wParam, msg.lParam);
- }
- }
|