Qt之簡單的異步操作實現方法

Qt簡單的異步操作

在實際應用中,經常會遇到一些耗時操作,導致瞭主線程的阻塞,這時候可以使用異步操作來避免阻塞。

Qt的異步操作需要使用下面的庫

#include <QtConcurrent/QtConcurrent>

然後將耗時操作丟進下面的函數中即可。

QtConcurrent::run([=]()
    {
        func();
    });

如果需要判斷耗時操作執行完畢與否,可以使用QFuture和QFutureWatcher的結合。QFuture 表示異步計算的結果,QFutureWatcher 則允許使用信號和槽監視 QFuture。

代碼如下。

    QFutureWatcher<void> *pwatcher = nullptr;
    pwatcher = new QFutureWatcher<void>;

    //把掃描到的wifi信息輸出到指定文件
    QFuture<void> future = QtConcurrent::run([=]()
    {
        func(); //耗時操作
    });

    connect(pwatcher, &QFutureWatcher<void>::finished, this, [=]()
    {
        core(); //主線程操作
    });

    pwatcher->setFuture(future);

QtConccurent管理的線程實際是從線程池分配線程資源的,而綁定QFutureWatcher的槽是在主線程中執行的。

在需要單次執行且內部邏輯較簡單的時候使用QtConccurrent + QFuture + QFutureWatcher是很方便的,可以減少很多編碼工作量,而且在多cpu環境中,QtConccurent也會啟用多核。

Qt異步變同步問題

解決的問題

很多情況會出現多線程程序,再進行操作時候,其中一個線程的邏輯執行需要另外一個線程的一個信號,那麼異步變同步就變得無比重要

如何實現

使用:QEventLoop類

The QEventLoop class provides a means of entering and leaving an event loop.

QEventLoop類提供瞭一種進入和離開事件循環的方法。  

At any time, you can create a QEventLoop object and call exec() on it to start a local event loop. From within the event loop, calling exit() will force exec() to return.

在任何時候,您都可以創建一個QEventLoop對象並在其上調用exec()來啟動一個本地事件循環。 在事件循環中,調用exit()將強制返回exec()。  

代碼塊解析

    QEventLoop q;
    QTimer t;
    t.setSingleShot(false);
    connect(&t, &QTimer::timeout, this, [=](){
        //TODO SOMETHING
    });
    connect(this, SIGNAL(connectStatusChangedSig()), &q, SLOT(quit()));  //異步調用完成退出
    t.start(50);
    q.exec();

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: