解析 Qt 進程間通信類 QCOP協議
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發送到管道中。
通過這樣的過程,用戶可以很方便地實現不同對象、不同進程之間通信過程,而且可以根據需要在通信過程中任意傳遞參數。
小結:Qt 進程間通信類 QCOP協議的內容介紹完了,希望本文對你有所幫助!