消息驱动与线程处理

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

这里要用到两个函数,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值