先看看Qt所提供的进程间通讯的机制:
1) D-BUS
在编译的时候加上DBUS的支持,QtDBUS模块包括很多类,QDBus为头的类。
因为很多第三方的库用的是D-BUS协议通讯,所以Qt可以用QtDBUS来和这些软件通讯。
2)TCP/IP
QTNetwork模块负责处理网络通讯,提供了QHttp,QFtp等类
3)共享内存
QSharedMemory类实现了对操作系统共享内存的访问
4)Qt Communucations Protocol (QCop)
QCopChannel类 (只在embedded版本中有),QCop是对Qt的signal/slot机制的扩展,它使得一个进程发出的signal,连接到另一个进程的slot。其实现原理其实就是有client/server,通过socket,在server里记录了channel的名字,以及对应关系,然后转发消息给相应的进程。具体可参考
http://blog.chinaunix.net/u2/67984/showart_1354503.html
用法是
发送方:直接调用send函数发消息,
接收方: 初始化一个QCopChannel实例(以你想监听的channel名字为参数),然后connect它的received信号到一个slot去处理。
我们再来看看Qtopia所提供的进程间通讯机制,Qtopia提供了3个类。
QtopiaIpcAdaptor
QtopiaIpcEnvelope
QtopiaChannel
Qtopia推荐用QtopiaIpcAdaptor,因为它更powerful 并且更易于支持客户定制的类,
QtopiaIpcAdaptor用法也很简单 。
例如:
sender : 发出 changeValue message
QtopiaIpcAdaptor *adaptor = new QtopiaIpcAdaptor("QPE/Foo");
QtopiaIpcAdaptor::connect
(source, SIGNAL(valueChanged(int)), adaptor, MESSAGE(changeValue(int)));
receiver : 调用 setValue slot
QtopiaIpcAdaptor *adaptor = new QtopiaIpcAdaptor("QPE/Foo");
QtopiaIpcAdaptor::connect
(adaptor, MESSAGE(changeValue(int)), dest, SLOT(setValue(int)));
另外的2个类 QtopiaChannel,QtopiaIpcEnvelope 是为了为了支持以前的应用程序。
QtopiaChannel 其实就是对QcopChannel的再包装,,
它提供的几个函数分别为
flush ---》调用QCopChannel::flush()
isRegistered ---》调用QCopChannel::isRegistered
send(const QString &channel, const QString &msg) -->调用QCopChannel::send (不带参数的消息)
send ( const QString & channel, const QString & msg, const QByteArray & data ) -->调用QCopChannel::send (带参数的消息)
所以QtopiaChannel实际上没做多少事情。
QtopiaIpcEnvelope的作用是使得发消息更加易于使用,它继承QDataStream,这使得对于参数可以
用<< 来添加
用法是 : QtopiaIpcEnvelope e(channelname, messagename);
e << parameter1 << parameter2 << ...;
然后在析构函数中,调用了QtopiaChannel::send把消息发出去
所以Qtopia所提供的3个类都是对Qt的QCop的包装,使得更好用而已。
阅读(1252) | 评论(0) | 转发(0) |