QCOP协议——Qt的进程间通信类

QCOP 是 Qt 内部的一种通信协议,这种协议用于不同的客户之间在同一地址空间内部或者不同的进程之间的通信。目前,这种机制还只在 Qt 的嵌入式版本中提供。

为实现这种通信机制,Qt 中包括了由 QObject 类继承而来的 QCopChannel 类,该类提供了诸如 send()、isRegistered() 等静态函数,它们可以在脱离对象的情况下使用。为了在 channel 中接收通信数据,用户需要构造一个 QCopChannel 的子类并提供 receive() 函数的重载函数,或者利用 connect() 函数与接收到的信号相联系。

值得一提的是,在 Qt 系统中,只提供了 QCOP 协议机制和用于接收消息的类,而如何发送消息则没有提供相应的类供用户使用。

在基于 Qt 的桌面系统 Qtopia(QPE)中,则提供了相应的发送类:QCopEnvelope。用户可以通过该类利用 channel 向其他进程发送消息。该类将通过 QCopChannel 发送 QCop 消息的过程进行了封装,用户只需要调用该类中的相关函数就可以方便地实现进程之间的通信过程。一方面,QCop 消息的发送要利用 QCopEnvelope 类,另一方面,接收消息则是通过与一个 QCopChannel 相关联。

在发送消息时,将利用如下的协议机制:

QCopEnvelope e(channelname, messagename);

对于需要携带参数的消息,必须使用"<<()"运算符将参数添加到envelope中。

e << parameter1 << parameter2 << ...;

对于不带参数的消息,只需要利用:

QCopEnvelope e(channelname, messagename);

在Qtopia中,所有的channels名都以"QPE/"开始,而messagename则是一个函数的标识符。

在接收消息时,通常只需要利用在应用程序中预先定义好的QPE/Application/{appname}管道,当然,也可以根据需要自己定义管道,并将其与一个slot函数相关联:

myChannel = new QCopChannel( "QPE/FooBar", this );
connect( myChannel, SIGNAL(received(const QCString &, const QByteArray &)),
this, SLOT(fooBarMessage( const QCString &, const QByteArray &)) );

下面将具体的通信过程举例如下:

在需要接收消息的类(如Window1)中定义管道:

	QCopChannel *doChannel = new QCopChannel("QPE/Do", this);
connect(doChannel, SIGNAL(received(const QCString &, const QByteArray &)),
this, SLOT(doMessage(const QCString &, const QByteArray &)));

同时,需要在该类中定义相应的消息处理函数doMessage,

void Window1::doMessage(const QCString &msg, const QByteArray &args)
{
QDataStream stream(args, IO_ReadOnly);
if(msg == "Message1(QString)")
{
QString text;
stream >> text;
button->setText(text);
}
else if(msg == "Message2()")
{
close();
}
}

其中的Message1(QString)和 Message2(QString)都是用户自己定义的消息,该函数中分别对这些消息进行了相应的处理。在该例中当收到带有参数的Message1消息 时,将该字符串参数stream显示在按钮button上;当收到Message2消息时,将执行关闭Window1窗口的动作,当然用户可以根据需要自 行编写相应的处理过程。

另一方面,在类Class2中需要发出消息的函数function中利用QCopEnvelope发送消息:

void Class2::function()
{ QCopEnvelope e("QPE/Do", "Message1(QString)");
e << param; }

这里发出了Message1消息,并将需要携带的参数param发送到管道中。

通过这样的过程,用户可以很方便地实现不同对象、不同进程之间通信过程,而且可以根据需要在通信过程中任意传递参数。

posted @ 2009-05-26 17:49  firefly_liu  阅读(9445)  评论(0编辑  收藏  举报