QCopChannel的工作原理
一般來說,不同的應用程序會啓動不同的進程,這樣就會產生進程間通信問題,比較常見的是進程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,上述語句執行完後,消息會自動發到指定管道,無需手動操作。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/fjiale/archive/2010/07/13/5731964.aspx