QCopChannel的用法
QT提供了很多的進(jìn)程間通訊的方法,例如共享內(nèi)存,QProcess等等。但有一種方法是嵌入式端所獨(dú)有的,那就是Qt Communications Protocol(QCOP)QT通訊協(xié)議,這種方法只能用于QT Embeded。
網(wǎng)上關(guān)于這種用法的資料比較少,研究了半天才搞明白是怎么回事。
QCOP將進(jìn)程間的通訊簡(jiǎn)化,使之就像使用QT中的信號(hào)與槽一樣方便。
用法:
1.首先是編寫接收消息的程序
channel = new QCopChannel(QString("/System/recevie"),this);connect(channel, SIGNAL(received(const QString&,const QByteArray&)), this, SLOT(processReceviedMsg(const QString&,const QByteArray&)));? 這個(gè)/System/recevie可以隨便填寫,但在之后必須與發(fā)送端的程序設(shè)定的一致。 QCopChannel類中已經(jīng)提供了一個(gè)信號(hào)received(const QString&,const QByteArray&),只需要將這個(gè)信號(hào)連接到自己寫好的槽函數(shù)上,就可以使用了。 這個(gè)信號(hào)的第一個(gè)參數(shù)是類型,可以讓你識(shí)別發(fā)過來的消息是什么類型,可以自由填寫任意的字符串,只要你自己知道就行。 第二個(gè)參數(shù),是數(shù)據(jù),是你傳送過來的數(shù)據(jù)。 ?
?
2.編寫發(fā)送消息的程序 發(fā)送端的編寫就更簡(jiǎn)單了。 ?
QByteArray data;QCopChannel::send(QString("/System/recevie"), "print(QString)", data);? 只需要讓send中的/System/recevie與接收端的一致,那么發(fā)送的消息就會(huì)發(fā)給所有注冊(cè)了/System/recevie的進(jìn)程。 還可以使用
QCopChannel::isRegistered("/System/recevice");?
查詢是否有這個(gè)channel注冊(cè)過。
?
注意事項(xiàng):
研究怎么使用QCOP的過程中,遇到了一些問題,寫出來,希望對(duì)別人有幫助。
1.A進(jìn)程以服務(wù)器的形式運(yùn)行(也就是加了-qws參數(shù)),B進(jìn)程以客戶端形式運(yùn)行(未加-qws參數(shù)),那么A向B發(fā)送的消息,B是不能接收的。但B向A發(fā)送消息,A是可以收到的。
2.在嵌入式端不需要所有程序都加上-qws參數(shù),只需要有一個(gè)程序以服務(wù)器形式運(yùn)行,其他程序也都可以正常運(yùn)行,這樣才能由一端向另一端發(fā)送消息。
3.如果需要相互發(fā)送消息,只要另外運(yùn)行一個(gè)帶-qws參數(shù)的程序C,再啟動(dòng)這兩個(gè)程序A和B(不加-qws),這樣A和B就可以互通消息了。
轉(zhuǎn)載于:https://www.cnblogs.com/cxjchen/p/3184057.html
總結(jié)
以上是生活随笔為你收集整理的QCopChannel的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么用C而不用C++
- 下一篇: jsp动作之 getProperty