當前位置:編程學習大全網 - 源碼下載 - Qt invokeMethod 異步調用

Qt invokeMethod 異步調用

程序中,我們經常會調用函數,如果調用的函數耗時較長,同步調用會造成主程序的堵塞。Qt中提供了壹個便捷的函數 QMetaObject::invokeMethod ,方便我們異步調用,從而解決這壹問題。本文只要講述 QMetaObject::invokeMethod 的使用方法。

此函數用於調用對象的成員(信號或插槽)。如果可以調用成員,則返回true。如果沒有此類成員或參數不匹配,則返回false。

QMetaObject::invokeMethod 除上文這個函數以外還有5個重載函數,這裏不再贅述。

參數說明:

obj :被調用對象的指針

member :成員方法的名稱

type :連接方式,默認值為 Qt::AutoConnection

ret :接收被調用函數的返回值

val0 ~ val9 :傳入被調用函數的參數,最多十個參數

註:必須要使用 Q_RETURN_ARG() 宏來封裝函數返回值、 Q_ARG() 宏來封裝函數參數。

若壹個對象obj有壹個槽函數func(QString,int),返回值為bool,那麽調用方式如下:

註: 使用 Qt::QueuedConnection 異步調用,將無法獲取返回值,因為此連接方式只是負責把事件交給事件隊列,然後立刻返回,所以,函數返回值就無法確定了。

但,我們可以使用上文提及的 Qt::BlockingQueuedConnection 連接方式,這個連接方式會阻塞發射信號的線程壹直等到隊列連接槽返回後,才會恢復阻塞,這樣就可以保證我們能得到函數的返回值。使用如下:

需要註意的是,qt官方文檔中的提醒: 使用此連接類型在同壹線程中的對象之間進行通信將導致死鎖

最後,因為連接方式 type 默認值為 Qt::AutoConnection ,所以當被調用的obj與調用者不在同壹線程中,可以直接調用:

使用 QMetaObject::invokeMethod 來調用函數時,當函數的參數有自定義類型時,程序將會報錯,因為調用的類型必須是信號、槽,以及Qt元對象系統能識別的類型。可以使用Qt命名類型所提供的 qRegisterMetaType() 來註冊自定義類型。

示例如下:

  • 上一篇:區塊鏈技術到底是壹種什麽樣的技術?
  • 下一篇:請問怎麽才能發現股市裏的莊家?
  • copyright 2024編程學習大全網