QCopChannel的工作原理

QCopChannel的工作原理

 

一般来说,不同的应用程序会启动不同的进程,这样就会产生进程间通信问题,比较常见的是进程A发送了一个消息a给进程B,进程B调用自己的方法b()进行处理。由于运行中的进程往往就是多个类的执行过程,下面将A, B简化为进程中的类。

在B中如何处理消息

1. 在类B中注册一个QCopChannel,注册时要给出自己的身份标识。

QCopChannel*  AChannel = new QCopChannel("System/APP/B", this);

其中"System/APP/B"是进程B在系统注册的名称,其它进程要通过这个名称来访问它。

2. 创建一个slot函数并将其同AChannel传回的消息绑定,这样一旦有消息从AChannel传出,则这个slot函数就会执行。

connect(sysChannel, SIGNAL(received(const QCString &, const QByteArray &)),

this, SLOT(b(const QCString &, const QByteArray &)));

3. 实现void b(const QCString & msg, const QByteArray & data) 函数。

   其中msg是要传递的消息名称,如”quit()”、”open(QString)”、”edit(QString, int)”;

   并不是来自A的所有消息我们都要处理,所以这里要做一个判断。

Data是消息的附加信息,即msg消息中的参数(如open(QString)中的QString具体值),要取出这个值有点麻烦,比如要取出edit(QString,int)的两个参数:

QDataStream stream(data, IO_ReadOnly);

QString str;

int i

stream >> str;

stream >> i;

       在A中如何发送消息:

1.       直接发送:QCopChannel::send("System/APP/B", "stopStartupAnimation()");

第一个参数是接收该消息的管道名,第二个是msg名称。

如果msg带参数,则还要将参数输入到一个QByteArray类的data中:

QByteArray data;

QDataStream s(data, IO_WriteOnly);

       QCString str(“hello”);

s << str;

QCopChannel::send("System/APP/B", "print(QString)", data);

2.       将其包装到一个信封里发送:

QCopEnvelope e("System/APP/B ", "closing(QString)");

QString str(“hello”);

e << str;

采用这种方式可以直接输入数据,不用经过QDataStream,上述语句执行完后,消息会自动发到指定管道,无需手动操作。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fjiale/archive/2010/07/13/5731964.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值