Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1542718
  • 博文数量: 237
  • 博客积分: 5139
  • 博客等级: 大校
  • 技术积分: 2751
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-18 14:48
文章分类

全部博文(237)

文章存档

2016年(1)

2012年(4)

2011年(120)

2010年(36)

2009年(64)

2008年(12)

分类:

2010-02-26 10:56:18

先用一个通俗的例子来解释:比如我们需要实现这样一种模式,应用由进程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,注意使用不同的名字。
阅读(1005) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-03-09 17:34:54

学习了