欢迎来到天天文库
浏览记录
ID:33191777
大小:46.50 KB
页数:5页
时间:2019-02-21
《qt的内部进程通信》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、QT的内部进程通信Qt作为一种跨平台的基于C++的GUI系统,能够提供给用户构造图形用户界面的强大功能。自从1996年Qt被Trolltech公司发布以来,该系统成为世界上很多成功的图形用户应用所使用的主要系统。更为重要的是,Linux操作系统的桌面环境系统KDE也是基于Qt构造的。目前,Qt已经提供了对包括MS/Windows、Unix/X11和嵌入式平台的支持,得到了越来越广泛的应用。在Qt系统中,不仅有着构造完善的系统结构,而且为了满足用户对编写图形用户界面应用的种种需求,它还创建了许多新的系统机制,其中Qt所特有的内部进程通信机制尤其值
2、得一提。本文分析了基于QT的应用进程之间通信常用的三种机制:QCOP协议,Signal-Slot机制和FIFO机制。给出了各自的使用方法,并指出了各自的使用场合。1、QCOP协议QCOP是Qt内部的一种通信协议,这种协议用于不同的客户之间在同一地址空间内部或者不同的进程之间的通信。目前,这种机制还只在Qt的嵌入式版本中提供。为实现这种通信机制,Qt中包括了由QObject类继承而来的QCopChannel类,该类提供了诸如send()、isRegistered()等静态函数,它们可以在脱离对象的情况下使用。为了在channel中接收通信数据,用
3、户需要构造一个QCopChannel的子类并提供receive()函数的重载函数,或者利用connect()函数与接收到的信号相联系。值得一提的是,在Qt系统中,只提供了QCOP协议机制和用于接收消息的类,而如何发送消息则没有提供相应的类供用户使用。在基于Qt的桌面系统Qtopia(QPE)中,则提供了相应的发送类:QCopEnvelope。用户可以通过该类利用channel向其他进程发送消息。该类将通过QCopChannel发送QCop消息的过程进行了封装,用户只需要调用该类中的相关函数就可以方便地实现进程之间的通信过程。一方面,QCop消息
4、的发送要利用QCopEnvelope类,另一方面,接收消息则是通过与一个QCopChannel相关联。在发送消息时,将利用如下的协议机制: QCopEnvelopee(channelname,messagename);对于需要携带参数的消息,必须使用"<<()"运算符将参数添加到envelope中。 e<5、而messagename则是一个函数的标识符。在接收消息时,通常只需要利用在应用程序中预先定义好的QPE/Application/{appname}管道,当然,也可以根据需要自己定义管道,并将其与一个slot函数相关联: myChannel=newQCopChannel("QPE/FooBar",this); connect(myChannel,SIGNAL(received(constQCString&,constQByteArray&)), this,SLOT(fooBarMessage(constQCString&,con6、stQByteArray&))); 下面将具体的通信过程举例如下,在需要接收消息的类(如Window1)中定义管道: QCopChannel*doChannel=newQCopChannel("QPE/Do",this); connect(doChannel,SIGNAL(received(constQCString&,constQByteArray&)),this,SLOT(doMessage(constQCString&,constQByteArray&))); 同时,需要在该类中定义相应的消息处理函数doMessage, voi7、dWindow1::doMessage(constQCString&msg,constQByteArray&args) { QDataStreamstream(args,IO_ReadOnly); if(msg=="Message1(QString)") { QStringtext; stream>>text; button->setText(text); } elseif(msg=="Message2()") { close(); } } 其中的Message1(QString)和Message2(QString)8、都是用户自己定义的消息,该函数中分别对这些消息进行了相应的处理。在该例中当收到带有参数的Message1消息时,将该字符串参数stream显示在按钮b
5、而messagename则是一个函数的标识符。在接收消息时,通常只需要利用在应用程序中预先定义好的QPE/Application/{appname}管道,当然,也可以根据需要自己定义管道,并将其与一个slot函数相关联: myChannel=newQCopChannel("QPE/FooBar",this); connect(myChannel,SIGNAL(received(constQCString&,constQByteArray&)), this,SLOT(fooBarMessage(constQCString&,con
6、stQByteArray&))); 下面将具体的通信过程举例如下,在需要接收消息的类(如Window1)中定义管道: QCopChannel*doChannel=newQCopChannel("QPE/Do",this); connect(doChannel,SIGNAL(received(constQCString&,constQByteArray&)),this,SLOT(doMessage(constQCString&,constQByteArray&))); 同时,需要在该类中定义相应的消息处理函数doMessage, voi
7、dWindow1::doMessage(constQCString&msg,constQByteArray&args) { QDataStreamstream(args,IO_ReadOnly); if(msg=="Message1(QString)") { QStringtext; stream>>text; button->setText(text); } elseif(msg=="Message2()") { close(); } } 其中的Message1(QString)和Message2(QString)
8、都是用户自己定义的消息,该函数中分别对这些消息进行了相应的处理。在该例中当收到带有参数的Message1消息时,将该字符串参数stream显示在按钮b
此文档下载收益归作者所有