下面的switch +case 和 线程同步用的有神马问题吗?我的主管加主管的主管都不会

jyzdtn 2011-05-05 08:14:45
下面的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;
}
...全文
324 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
redkit 2011-05-09
  • 打赏
  • 举报
回复
BREAK注释掉,怎么看怎么别扭。
jyzdtn 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xiaopoy 的回复:]
关于
BOOL CUECtrlV20::ProcessResponseMsgs(OM_MSG_STRU_V2* pOmMsg)
VOID CRespMsgInfo::SetRspMsgInfo(OM_MSG_STRU_V2* pucInfo )
我是想说,如果这二个只是类似于一个因为重复的流程而被分割出来,变成子函数的一段代码,也就是说只在这段代码里调用到了。
[/Quote]

恩 谢谢所有的人,对了 大家觉得我的 那个 关键事件 怎么个处理最佳
lijianli9 2011-05-07
  • 打赏
  • 举报
回复
说明你们公司技术力量差呗,
还有什么好说的。
tompaz 2011-05-07
  • 打赏
  • 举报
回复
case不加break,这个你的主管的主管也不会?
xiaopoy 2011-05-07
  • 打赏
  • 举报
回复
关于
BOOL CUECtrlV20::ProcessResponseMsgs(OM_MSG_STRU_V2* pOmMsg)
VOID CRespMsgInfo::SetRspMsgInfo(OM_MSG_STRU_V2* pucInfo )
我是想说,如果这二个只是类似于一个因为重复的流程而被分割出来,变成子函数的一段代码,也就是说只在这段代码里调用到了。
xiaopoy 2011-05-07
  • 打赏
  • 举报
回复
我觉得这几个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);

最重要的还是看懂现有代码的意思啊,不然什么改进都是纸上谈兵。 /:^]
xiaopoy 2011-05-06
  • 打赏
  • 举报
回复
唔。废话,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_0 wait的object被设置了,你的情况就是这种时候才是SetEvent发生了。
WAIT_TIMEOUT 设置的超时时间到达了,wait到超时返回了。
wocow3 2011-05-06
  • 打赏
  • 举报
回复
为啥注释掉break?
switch分支不加break,满足一个分支条件后,后面所有分支的代码都会执行
jyzdtn 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaopoy 的回复:]
唔。废话,break注释掉,在case ID_APP_MM_INQ_IMSI_CNF_V2的时候,不就执行的是:
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventimsi);
ProcessResponseMsgs(pOMTMsg);
SetEvent(g_hEventtmsi);
ProcessResponseMsgs(pOMTMsg)……
[/Quote]
非常感谢 对了,你觉得我的代码 逻辑机制怎么改进比较好
MoXiaoRab 2011-05-06
  • 打赏
  • 举报
回复
我眼睛看花了
寒冰2046 2011-05-06
  • 打赏
  • 举报
回复
建议贴代码的时候,使用“插入源代码”功能,增加语法着色、缩进,看起来会顺眼很多。
smwhotjay 2011-05-06
  • 打赏
  • 举报
回复
可以看出代码很乱,逻辑实现杂糅. Event这东西很容易破坏设计架构. 多线程要设计好.避免出bug.
chenjiawei007 2011-05-06
  • 打赏
  • 举报
回复
写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以下你也是察觉不到的。
看不见的裂痕 2011-05-06
  • 打赏
  • 举报
回复
你主管的主管的主管会么?
jyzdtn 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heksn 的回复:]
你这一大坨代码 很难让人理解啊
[/Quote]
恩 我说了思路啊
在 http://topic.csdn.net/u/20110505/17/dcba9e57-d30a-485f-8361-b9a872a3b00a.html

  • 打赏
  • 举报
回复
你这一大坨代码 很难让人理解啊
龙行天下之Sky 2011-05-05
  • 打赏
  • 举报
回复
不要动不动就贴代码,说思路
Eleven 2011-05-05
  • 打赏
  • 举报
回复
jyzdtn 2011-05-05
  • 打赏
  • 举报
回复
下面是主线程:
线程同步用的是:http://topic.csdn.net/u/20110505/17/dcba9e57-d30a-485f-8361-b9a872a3b00a.html

主线程连续发消息给服务器,服务器会依次 回复上面的 case从上到下的 ID

m_respMsgInfo.SetRspMsgInfo4Wait(ID_APP_MM_INQ_MM_INFO_CNF_V2);


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); //我的问题是:这里怎么不卡住啊....
......

BOOL CRespMsgInfo::SetRspMsgInfo4Wait(UINT32 ulMsgId )
{
CMYCriticalSection lock(&m_csLock, TRUE);
m_ulResponseMsgId = ulMsgId;
m_ulInfoLen = 0;
memset(m_aucInfo,0,10000);
PRINT_LOG("CRespMsgInfo","SetRspMsgInfo4Wait","set expected msg 0x%x",m_ulResponseMsgId);

return TRUE;
}

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧