图 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将被调用。