• 7979阅读
  • 4回复

哪位高人能告诉我QCopChannel的工作原理? [复制链接]

上一主题 下一主题
离线jszeng
 

只看楼主 倒序阅读 楼主  发表于: 2006-04-17
qtopia中当连接上插件时,会根据.direcrory中的apply内容发送消息给qte.
如plugins\applets目录下的.directory文件中的Apply=QPE/TaskBar reloadApplets(),这样当把该应用的插件连接上时,pluginmanager会调用一个QCopEnvelope e("QPE/TaskBar" ,"reloadApplets()"),之后在工具栏上便显示了你所需要的那些应用的插件.
请问,调用一个QCopEnvelope e("QPE/TaskBar" ,"reloadApplets()")之后的工作原理是什么?谢谢各位高手指点!
离线luse
只看该作者 1楼 发表于: 2006-04-17
QCopEnvelope 的通讯最后是基于linux下的socket进行通信的。
QCopEnvelope 这里需要注意的是所有的QCopEnvelope 都是函数内部({})构造,因为这样在函数退出的时候会析构QCopEnvelope ,qcop消息是在析构的时候发送出去的(参考QCopEnvelope 的析构函数)。
在发送消息的时候是通过QWSDisplay(用于c/s之间通信的底层类)进行消息的发送和接受。
上面所说的内容基于的版本是qt2.3.10。
离线jszeng

只看该作者 2楼 发表于: 2006-04-18
谢谢一楼的帮忙,不过我还有个问题,最终qcop消息出来后传给qtopia中的哪里?是根据QPE/TaskBar查找到TaskBar类,然后构造一个TaskBar对象,再调用TaskBar::receive函数来查询reloadApplets()的吗?
那当中又是如何找到TaskBar类的?再次感谢!
离线luse
只看该作者 3楼 发表于: 2006-04-19
图 3


上面的流程图是我们的C/S之间的qcop通信过程。整个过程如下。
1、    先是我们的client发送一条QcopSend消息,这条消息一般是在调用~QcopEnvelope析构函数的时候发送的,关于这个类的使用我们在后面详细的描述。
2、    我们的server在对应的socket接收这个消息以后,这里也是在doClient进行处理,对于QcopSend消息,server最终会调用进行处理。注意在这里对于qcop内部的消息类型,有两种:isRegistered和detach,这两个消息分别是用来,查询是否已经注册qcop通道和注销通道的。对于注销通道,server先将client从对应的qcopchannel中删除,如果channel的client列表为空,那么就需要删除这个通道了。
3、    如果是普通的消息,server这是就会向channel的client列表的所有client发送QWSEvent::QcopMessage消息,client端然后对QWSEvent::QcopMessage进行处理,在qwsProcessEvent消息中会调用QcopChannel::sendLocally,发送信号给相应的QcopEnvelope对象。

对于taskbar,它的qcop部分代码如下
  QCopChannel *channel = new QCopChannel( "QPE/TaskBar", this );
  connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
   this, SLOT(receive(const QCString&,const QByteArray&)) );
注意:在上面的第3步,QcopChannel::sendLocally中,taskbar的槽receive将被调用。
离线jszeng

只看该作者 4楼 发表于: 2006-04-20
谢谢楼上的帮忙,虽然图3可能丢失了,但我大体上明白了意思!再次感谢!
快速回复
限100 字节
 
上一个 下一个