日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt使用invokeMethod反射机制实现进程间的通信

發布時間:2023/11/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt使用invokeMethod反射机制实现进程间的通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? 對于Qt來說,UI線程是主線程,對于同一UI線程中對象的通信可以通過connect進行信號與槽關聯來實現,但是當UI中對象A中的子線程B需要和另外UI對象C進行通信的時候,如果這個時候使用connect來進行通信的話,需要B對象和A對象進行關聯將信號發送到主線程中,然后A對象和C對象再建立聯系,這樣處理起來會比較繁瑣。Qt提供了invokeMethod反射機制,就可以實現任何線程中的數據之間傳輸,使用invokeMethod的前提條件是1)對象繼承QObject; 2)定義的類中使用Q_OBJECT(可以使用信號與槽),具體invokeMethod函數原型如下:

[static] bool QMetaObject::invokeMethod(Qobject *object, const char*member, Qt::Connection Type type, QGenericReturnArgument val = QGenericArgument(), .....);

其中object為C對象,member為C對象中的信號或者槽方法的名字(字符串),type為調用信號或者槽函數的同步異步方式,后面的為信號或者槽函數中的參數類型(元對象系統能夠識別的參數類型)及需要傳遞的參數;具體調用方式如下所示:

class C: public Qobject {Q_OBJECT public:static C* getInstance() {static QScopedPoint(C) inst;if (Q_UNLIKELY(!inst)) {if (!inst) {inst.reset(new C);}}return inst.data();} static void doAddNum(int a, int b) { //通過單例來獲取對象C,從而調用C對象的槽方法;//也可以通過封裝doAddNum方法來實現一個類D,這樣的話C中只需要創建一個對象D然后調用D中的方法QMetaObject::invokeMethod(getInstance(), "addNum", Q_ARG(int, a), Q_ARG(int, b);} public slots:void addNum(int a, int b); private:C(Qobject *parent = nullptr) {} }; class A : public QObject {Q_OBJECT public:A(QObject *object = nullptr) {//一般來說實現B和C直接的通信,需要B把數據發送給A,然后A發送給C來實現;//A和B同屬于主線程,C屬于子線程B* thread = new B(); thread->start();} } class B: public QThread {Q_OBJect public:B() {}void run() {C::doAddNum(1, 2); //在子線程中完成對C對象中的槽方法的調用,屬于跨線程調用} }

?

總結

以上是生活随笔為你收集整理的Qt使用invokeMethod反射机制实现进程间的通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。