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。