A方,使用静态方式创建MessageQ消息结构体,然后给B方发送(MessageQ_put)消息HostMsg,如果B方接收(MessageQ_get)消息HostMsg后,不应答(重新MessageQ_put),这样执行后会出现什么问题??
A方,创建消息如下:
/* create local message queue (inbound messages) */
MessageQ_Params_init(&msgqParams);
MsgQ_LReply = MessageQ_create(MsgQLocalName, &msgqParams);
if (MsgQ_LReply == NULL) {
IoMsg_Error("Error: %s, line %d: Dsp_conMsgQHost: message queue create failed\n",
__FILE__, __LINE__);
status = -1;
goto leave;
}
/* get the SR_0 heap handle */
ShRegion_heap = (IHeap_Handle)SharedRegion_getHeap(0);
/* allocate a static message buffer from SR_0 heap */
HostMsg = (Server_Msg *)Memory_alloc(ShRegion_heap, HostMsgSize, 0, NULL);
if (HostMsg == NULL) {
IoMsg_Error("Error: %s, line %d: Dsp_conMsgQHost: could not allocate message\n",
__FILE__, __LINE__);
status = -1;
goto leave;
}
/* initialize message header, only needs to be done once */
MessageQ_staticMsgInit((MessageQ_Msg)HostMsg, HostMsgSize);
MessageQ_setReplyQueue(MsgQ_LReply, (MessageQ_Msg)HostMsg);
然后,A发送消息到B方:
status = MessageQ_put(MsgQ_Remote, (MessageQ_Msg)HostMsg);//发送当前消息
B方接收消息并进行处理:
status = MessageQ_get(hoMsgQue, (MessageQ_Msg *)&DspHostMsg,1000);//MessageQ_FOREVER
if (status == MessageQ_E_FAIL)
{
IoMsg_Error("Dsp_ProcMsgThread: message get error=%d", (IArg)status);
goto leave;
}
else if(status < 0)
continue;
//对消息DspHostMsg进行处理
。
。
。
但是不把接收到的DspHostMsg,进行以下代码应答:
MessageQ_QueueId queId = MessageQ_getReplyQueue(DspHostMsg); /* type-cast not needed */
MessageQ_put(queId, (MessageQ_Msg)DspHostMsg);
这时候,
1、A的HostMsg能再次使用吗,再次使用时,若B未进行处理,会覆盖掉之前的内容吗
2、B在收到消息DspHostMsg后,不应答的情况下,需要对DspHostMsg进行释放操作吗,此消息在A方是静态创建的
3、A和B间的消息通路会存在问题吗
因为使用的参考例子是ex09_readwrite,是1对1无限等待方式的,由于担心无限等待若出现异常则整个系统都会锁死,所以改为有限等待方式
Kevin Le82:
这个论坛,没有地方可以查看到自己发表的所有主题,希望能改进下,进入用户那里应该可以查看自己的主题列表,这样才方便用户维护自己的问题
Denny%20Yang99373:
不应答的话A不知道B收到数据了,没法同步。。。
Kevin Le82:
回复 Denny%20Yang99373:
现在发现IPC里面很有问题,不知道其他人怎么用的,难道都没出问题吗?
如果静态MsgQ消息重复put上去,接收端就会出现异常导致崩溃。所以其他人在应用时put和get要配对,暂未使用动态的msgQ方式,不知道这种情况下有没有其他问题