下面的switch +case 和 线程同步用的有神马问题吗?我的主管加主管的主管都不会
下面的switch +case 和 线程同步用的有神马问题吗?我的主管加主管的主管都不会
UINT32 ulMsgId=OMT_NTOHL(pOMTMsg->ulMsgId);
switch(ulMsgId)
{
case APP_OM_SHAKEHAND_CNF_MSG_ID:
{
ProcessResponseMsgs(pOMTMsg);
break;
}
case ID_APP_MM_INQ_IMSI_CNF_V2:
{
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventimsi);
//break;
}
case ID_APP_MM_INQ_MM_INFO_CNF_V2:
{
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventtmsi);
//break;
}
case ID_PHY_DT_DL_SINR_IND:
{
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventsin);
//break;
}
case ID_RRC_APP_INQUIRE_CAMP_CELL_INFO_IND:
{
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventcell);
//break;
}
}
打印日志:值得一提的是 同一话 打印了3遍,我想问问 是不是和我上面的//break 注释掉 有关系
代码在下面
[05-05 15:57:39.331][CRespMsgInfo][SetRspMsgInfo]rev unexpected msg 0x31c01203
[05-05 15:57:39.331][CRespMsgInfo][SetRspMsgInfo]rev unexpected msg 0x31c01203
[05-05 15:57:39.331][CRespMsgInfo][SetRspMsgInfo]rev unexpected msg 0x31c01203
[05-05 15:57:39.331][CUECtrlV20][SearchTMSI]SearchTmsiStatus: command success
另外 ,最后一句 竟然没有报失败:command success
值得一提的是,我在主线程里做了线程同步的,主线程代码在最后面,我要问的是怎么没超时啊!?
下面是接收和处理消息的线程
BOOL CUECtrlV20::ProcessResponseMsgs(OM_MSG_STRU_V2* pOmMsg)
{
//here not need big to little,it has been done
if(APP_OM_SHAKEHAND_CNF_MSG_ID == OMT_HTONL(pOmMsg->ulMsgId))
{
m_usOriginalId = (pOmMsg->usOriginalId);
//SetEvent(g_hEvent);
SetEvent(m_Event);//
Sleep(100);
return TRUE;//
}
else
{
// if(ID_APP_MM_INQ_IMSI_CNF_V2 == OMT_HTONL(pOmMsg->ulMsgId)||ID_APP_MM_INQ_MM_INFO_CNF_V2 == OMT_HTONL(pOmMsg->ulMsgId)||ID_PHY_DT_DL_SINR_IND == OMT_HTONL(pOmMsg->ulMsgId))
//{
m_respMsgInfo.SetRspMsgInfo(pOmMsg);
//}
}
return TRUE;
}
VOID CRespMsgInfo::SetRspMsgInfo(OM_MSG_STRU_V2* pucInfo )
{
if(0 == pucInfo)
{
PRINT_LOG("CRespMsgInfo","SetRspMsgInfo","%s","input null ptr!");
return;
}
CMYCriticalSection lock(&m_csLock, TRUE);
if(OMT_HTONL(pucInfo->ulMsgId) == m_ulResponseMsgId)
{
PRINT_LOG("CRespMsgInfo","SetRspMsgInfo","rev right msg 0x%x",m_ulResponseMsgId);////m_ulIsUpdated = TRUE;
//ResetEvent(g_hEvent);
m_ulInfoLen = OMT_HTONL(pucInfo->ulLength) - 20;
memcpy(m_aucInfo,pucInfo->aucPara,m_ulInfoLen);
}
else
{
PRINT_LOG("CRespMsgInfo","SetRspMsgInfo","rev unexpected msg 0x%x",pucInfo->ulMsgId);
}
return;
}
[解决办法]
[解决办法]
不要动不动就贴代码,说思路
[解决办法]
你这一大坨代码 很难让人理解啊
[解决办法]
为啥注释掉break?
switch分支不加break,满足一个分支条件后,后面所有分支的代码都会执行
[解决办法]
唔。废话,break注释掉,在case ID_APP_MM_INQ_IMSI_CNF_V2的时候,不就执行的是:
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventimsi);
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventtmsi);
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventsin);
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventcell);
但是在SetRspMsgInfo里,前三次在执行到
if(OMT_HTONL(pucInfo->ulMsgId) == m_ulResponseMsgId)
时,判断到这个pucInfo->ulMsgId!=m_ulResponseMsgId,就打印
PRINT_LOG("CRespMsgInfo","SetRspMsgInfo","rev unexpected msg 0x%x",pucInfo->ulMsgId);
了3次。
最后一次判断到equ了,就去处理流程,成功了。
dws = WaitForSingleObject(g_hEventtmsi,30000); //我的问题是:这里怎么不卡住啊....
判断下WaitForSingleObject的返回值,
WAIT_ABANDONED要等待的是一个MUTEX类型时,可能会返回这个,情况是createmutex的那个线程被terminated了,所以没关闭mutex,于是返回了。
WAIT_OBJECT_0wait的object被设置了,你的情况就是这种时候才是SetEvent发生了。
WAIT_TIMEOUT设置的超时时间到达了,wait到超时返回了。
[解决办法]
你主管的主管的主管会么?
[解决办法]
写switch语句就写标准 ,因为switch往往有很强的处理逻辑业务,把break注释掉?
主管不会代码正常,但是程序员不知道代码就很危险了,
ResetEvent(g_hEventtmsi);
m_OmtSocket.Send((UINT8*)pMsg, ulMsgLen))
UINT32 ulResultLen;
UINT8 cnfinfo[sizeof(APP_MM_INQ_EMM_INFO_CNF_STRU) + 1000] ={0};
DWORD dws = 0;
dws = WaitForSingleObject(g_hEventtmsi,30000); //我的问题是:这里怎么不卡住啊....
这里,你的信号量是全局的,搜索你的工程,如果在短时间内信号量再次被打开,等待了1S以下你也是察觉不到的。
[解决办法]
可以看出代码很乱,逻辑实现杂糅. Event这东西很容易破坏设计架构. 多线程要设计好.避免出bug.
[解决办法]
建议贴代码的时候,使用“插入源代码”功能,增加语法着色、缩进,看起来会顺眼很多。
[解决办法]
我眼睛看花了
[解决办法]
我觉得这几个case都可以直接忽略掉。
因为ProcessResponseMsgs中特殊处理的只有一个APP_OM_SHAKEHAND_CNF_MSG_ID,其他的情况都交给SetRspMsgInfo了。如果说m_ulResponseMsgId的赋值时确定不会赋出
D_APP_MM_INQ_IMSI_CNF_V2 == OMT_HTONL(pOmMsg->ulMsgId)||ID_APP_MM_INQ_MM_INFO_CNF_V2 == OMT_HTONL(pOmMsg->ulMsgId)||ID_PHY_DT_DL_SINR_IND == OMT_HTONL(pOmMsg->ulMsgId)
之外情况的值,然后如果说
BOOL CUECtrlV20::ProcessResponseMsgs(OM_MSG_STRU_V2* pOmMsg)
VOID CRespMsgInfo::SetRspMsgInfo(OM_MSG_STRU_V2* pucInfo )
只在这儿有判断的话,那么就可以只留一个
case APP_OM_SHAKEHAND_CNF_MSG_ID: ProcessResponseMsgs(pOMTMsg); SetEvent(g_hEventtmsi); break;//然后都交给SetRspMsgInfo就好了啊 /:^)default: m_respMsgInfo.SetRspMsgInfo(pOmMsg); SetEvent(g_hEventcell);
[解决办法]
关于
BOOL CUECtrlV20::ProcessResponseMsgs(OM_MSG_STRU_V2* pOmMsg)
VOID CRespMsgInfo::SetRspMsgInfo(OM_MSG_STRU_V2* pucInfo )
我是想说,如果这二个只是类似于一个因为重复的流程而被分割出来,变成子函数的一段代码,也就是说只在这段代码里调用到了。
[解决办法]
case不加break,这个你的主管的主管也不会?
[解决办法]
说明你们公司技术力量差呗,
还有什么好说的。
[解决办法]
BREAK注释掉,怎么看怎么别扭。