消息驱动与线程处理

每个线程都有一个消息队列,后台建立线程处理大数据的时候,可以考虑通过消息队列来处理。

这里要用到两个函数,PostThreadMessage和GetMessage。示例代码如下

 #define UM_DEALRECVDATA WM_USER+1
DWORD m_ThreadId;
CWinThread * m_DealVelThread;
//tcp数据接收队列
CRITICAL_SECTION m_criTcp;
BOOL CDealVelPro::CreateDealRecvThread()
{
	m_DealVelThread=AfxBeginThread(ThreadDeal, (LPVOID)this);
	if (m_DealVelThread)
	{
		m_ThreadId=m_DealVelThread->m_nThreadID;
		return TRUE;
	}
	return FALSE;
}
UINT ThreadDeal(LPVOID _lpParam)
{
	CDealVelPro* v_pDealVelPro=(CDealVelPro*)_lpParam;
	if (v_pDealVelPro!=NULL)
	{
		MSG v_Msg;
		//强迫处理线程建立自己的消息队列
		::PeekMessage(&v_Msg, NULL, 0, 0, PM_NOREMOVE);
		while (::GetMessage( &v_Msg, NULL, 0, 0 ))
		{
			try{
				switch(v_Msg.message)
				{
				case UM_DEALRECVDATA:
					v_pDealVelPro->DealVelArrivedData(v_Msg.wParam,v_Msg.lParam);
					break;
				case UM_DEALEXIT:AfxEndThread(0);
					return 0;
				default:
					break;
				}
			}catch(...) {}
		}
	}
	return 1;
}
void CDealVelPro::OnTcpDataArrived(const char* _szData,int _iDataLen,UINT _uiSockIndex)
{
	CBaseData * v_pTcpData=new CBaseData;
	v_pTcpData->m_szData=new char[_iDataLen];
	memcpy(v_pTcpData->m_szData, _szData, _iDataLen);
	v_pTcpData->m_iLen=_iDataLen;
	v_pTcpData->m_uiSockIndex=_uiSockIndex;
	v_pTcpData->m_bDataType=ENNET_TCP;
	EnterCriticalSection(&m_criTcp);
	m_lstDatas.AddTail(v_pTcpData);LeaveCriticalSection(&m_criTcp);
	PostThreadMessage(m_ThreadId, UM_DEALRECVDATA, (WPARAM)this, NULL);
} 


 
  



 
  

这里先通过PeekMessage建立线程的消息队列,避免接收消息的队列还没有启动,PostMessage过来的消息就会丢失。然后再用GetMessage函数来获取消息。注意:这里不能通过PeekMessage来获取消息,应为PeekMessage不会等待消息而直接进行下步操作,会使线程占用cpu达到100%,而GetMessage会等待有消息到来才进入下一步。具体可以参见: http://www.iteye.com/wiki/blog/399228

你可能感兴趣的:(C++方面)