QCopChannel的工作原理

來源:互聯網
上載者:User

一般來說,不同的應用程式會啟動不同的進程,這樣就會產生處理序間通訊問題,比較常見的是進程A發送了一個訊息a給進程B,進程B調用自己的方法b()進行處理。由於運行中的進程往往就是多個類的執行過程,下面將A, B簡化為進程中的類。

在B中如何處理訊息

1. 在類B中註冊一個QCopChannel,註冊時要給出自己的身份標識。

QCopChannel*  AChannel = new QCopChannel("System/APP/B", this);

其中"System/APP/B"是進程B在系統註冊的名稱,其它進程要通過這個名稱來訪問它。

2. 建立一個slot函數並將其同AChannel傳回的訊息綁定,這樣一旦有訊息從AChannel傳出,則這個slot函數就會執行。

connect(sysChannel, SIGNAL(received(const QCString &, const QByteArray &)),

this, SLOT(b(const QCString &, const QByteArray &)));

3. 實現void b(const QCString & msg, const QByteArray & data) 函數。

   其中msg是要傳遞的訊息名稱,如”quit()”、”open(QString)”、”edit(QString, int)”;

   並不是來自A的所有訊息我們都要處理,所以這裡要做一個判斷。

Data是訊息的附加資訊,即msg訊息中的參數(如open(QString)中的QString具體值),要取出這個值有點麻煩,比如要取出edit(QString,int)的兩個參數:

QDataStream stream(data, IO_ReadOnly);

QString str;

int i

stream >> str;

stream >> i;

       在A中如何發送訊息:

1.       直接發送:QCopChannel::send("System/APP/B", "stopStartupAnimation()");

第一個參數是接收該訊息的管道名,第二個是msg名稱。

如果msg帶參數,則還要將參數輸入到一個QByteArray類的data中:

QByteArray data;

QDataStream s(data, IO_WriteOnly);

       QCString str(“hello”);

s << str;

QCopChannel::send("System/APP/B", "print(QString)", data);

2.       將其封裝到一個信封裡發送:

QCopEnvelope e("System/APP/B ", "closing(QString)");

QString str(“hello”);

e << str;

採用這種方式可以直接輸入資料,不用經過QDataStream,上述語句執行完後,訊息會自動發到指定管道,無需手動操作。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.