我正在使用MsgQueue将结构从一个进程发送到另一个进程。要读取消息队列,我使用while
循环检查ReadMsgQueue()
的返回值。根据{{3}},ReadMsgQueue()
返回 TRUE 表示成功, FALSE 表示失败。关于这些信息,我写了以下循环:
while(MsgQueueCommunicator::getInstance()->b_MsgQueueCommunicator_Read_MessageQueue(m_hMsgQAlarmState,alarm_params))
{
RETAILMSG(1,(_T("Update_ActiveAlarmList->alarm_params.i32_Alarm_Output: %d"), alarm_params.i32_Alarm_Output));
RETAILMSG(1,(_T("Update_ActiveAlarmList->alarm_params.i32AlarmType: %d"), alarm_params.i32AlarmType));
if(alarm_params.b_IsEnable == true)
{
RETAILMSG(1,(_T("Update_ActiveAlarmList->alarm_params = true")));
}
else
{
RETAILMSG(1,(_T("Update_ActiveAlarmList->alarm_params = false")));
}
}
RETAILMSG(1,(_T("END OF MSGQUEUE WHILE LOOP")));
所以我只是阅读结构并使用RETAILMSG()
检查值。我看到的是,我永远不会离开while循环,即使我已经停止写入队列。我通过在循环之后添加一个retailmsg来检查这个,我从未看到它被打印出来,同时,我在while循环中的零售消息也停止了,表明队列中没有其他内容可读。
一旦队列清空后,while循环是否应该退出,或者我是否误解了ReadMsgQueue()
的返回值?
修改
以下是b_MsgQueueCommunicator_Read_MessageQueue()
的声明:
BOOL MsgQueueCommunicator::b_MsgQueueCommunicator_Read_MessageQueue(HANDLE hq,AlarmParams& Byte_Flag)
{
uint32_t dwBytesRead;
uint32_t dwFlags;
return ReadMsgQueue(hq,(LPVOID)&Byte_Flag, sizeof(AlarmParams), &dwBytesRead,INFINITE,&dwFlags);
}