code_app/modules/base/HGMsgPumpImpl.cpp

102 lines
1.6 KiB
C++

#include "HGMsgPumpImpl.hpp"
HGMsgPumpImpl::HGMsgPumpImpl()
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
HGBase_CreateLock(&m_msgLock);
m_bRecvMsg = HGTRUE;
}
HGMsgPumpImpl::~HGMsgPumpImpl()
{
HGBase_DestroyLock(m_msgLock);
m_msgLock = NULL;
HGBase_DestroyEvent(m_msgEvent);
m_msgEvent = NULL;
}
HGResult HGMsgPumpImpl::Run(HGMsgPumpFunc func, HGPointer param)
{
if (NULL == func)
{
return HGBASE_ERR_INVALIDARG;
}
while (1)
{
HGBase_WaitEvent(m_msgEvent);
HGMsg msg = { 0 };
bool getMsg = false;
HGBase_EnterLock(m_msgLock);
if (!m_listMsg.empty())
{
msg = m_listMsg.front();
m_listMsg.pop_front();
getMsg = true;
}
if (m_listMsg.empty())
{
HGBase_ResetEvent(m_msgEvent);
}
HGBase_LeaveLock(m_msgLock);
if (!getMsg)
{
continue;
}
if (0 == msg.id)
{
assert(NULL == msg.data);
break;
}
else
{
func((HGMsgPump)this, &msg, param);
}
}
return HGBASE_ERR_OK;
}
HGResult HGMsgPumpImpl::PostMessage(const HGMsg* msg)
{
if (NULL == msg || 0 == msg->id)
{
return HGBASE_ERR_INVALIDARG;
}
HGResult ret = HGBASE_ERR_FAIL;
HGBase_EnterLock(m_msgLock);
if (m_bRecvMsg)
{
m_listMsg.push_back(*msg);
HGBase_SetEvent(m_msgEvent);
ret = HGBASE_ERR_OK;
}
HGBase_LeaveLock(m_msgLock);
return ret;
}
HGResult HGMsgPumpImpl::Exit()
{
HGMsg msg;
msg.data = 0;
msg.data = NULL;
HGResult ret = HGBASE_ERR_FAIL;
HGBase_EnterLock(m_msgLock);
if (m_bRecvMsg)
{
m_listMsg.push_back(msg);
HGBase_SetEvent(m_msgEvent);
m_bRecvMsg = HGFALSE;
ret = HGBASE_ERR_OK;
}
HGBase_LeaveLock(m_msgLock);
return ret;
}