先用一个通俗的例子来解释:比如我们需要实现这样一种模式,应用由进程A与进程B两部分组成,A有UI,负责用户交互;B没有UI,完全后台运行,A与B
之间可以相互通信。就如彩信的模式,彩信到达后后台下载,下载完给出提示信息(即用户界面),阅读彩信再激活“信息”程序。
进程通信即两个并行进程可以通过互相发送消息进行合作,消息是通过消息缓冲而在进程之间相互传递的。
RMsgQueue是3版提供的比较好的与事件机制融合的技术, 2版只能使用其它传统的, 信号量,
共享内存等技术.
解决方案:
让我们来看代码:
1.Server
void CP2PServer::ConstructL()
{
//创建
iMsgQueue.CreateGlobal(KGLobalName,
KNumberOfSlots, KMessageLength,
EOwnerProcess);
CActiveScheduler::Add( this); // Add to
scheduler
iMsgQueue.NotifyDataAvailable( iStatus
);//开始监听消息
SetActive(); // Tell scheduler a request
is active
}
void CP2PServer::RunL()
{
if (iStatus.Int() == KErrNone)
{
//接收数据
TRAPD(error,iMsgQueue.Receive(
&str_SendData, KMessageLength));
if(error==KErrNone)
{
iObserver->HandleMessageReceiveL(str_SendData.DataBuf.Left
(str_SendData.DataLength));
}
}
}
2.Client
void CP2PClient::ConstructL()
{
//创建
iMsgQueue.OpenGlobal(KGLobalName,
EOwnerProcess);
}
//发送消息
void CP2PClient::SendMessageL(const TDesC8&
aSendMessage)
{
STR_SENDDATA temp;
temp.DataLength =
aSendMessage.Length();
temp.DataBuf.Copy(aSendMessage);
iMsgQueue.Send(&temp,
KMessageLength);
}
就一些疑难问题解决如下:
B创建, 并且监控消息, A在需要时OpenGlobal, 然后发送消息, 之后直接关闭,
B会收到此消息开始下载.
这个就是一个消息队列, 只要创建者存在, 就可以使用, 一般这个设计都是B始终运行, 并且建立RMsgQueue,
其它进程需要时打开, 发送消息, 关闭.
如果双方都可以作为发送方与接受方,则每方都创建RMsgQueueBase,注意使用不同的名字。
阅读(1056) | 评论(1) | 转发(0) |