Qt之簡單的異步操作實(shí)現(xiàn)方法
Qt簡單的異步操作
在實(shí)際應(yīng)用中,經(jīng)常會(huì)遇到一些耗時(shí)操作,導(dǎo)致了主線程的阻塞,這時(shí)候可以使用異步操作來避免阻塞。
Qt的異步操作需要使用下面的庫
#include <QtConcurrent/QtConcurrent>
然后將耗時(shí)操作丟進(jìn)下面的函數(shù)中即可。
QtConcurrent::run([=]() ? ? { ? ? ? ? func(); ? ? });
如果需要判斷耗時(shí)操作執(zhí)行完畢與否,可以使用QFuture和QFutureWatcher的結(jié)合。QFuture 表示異步計(jì)算的結(jié)果,QFutureWatcher 則允許使用信號和槽監(jiān)視 QFuture。
代碼如下。
?? ?QFutureWatcher<void> *pwatcher = nullptr; ?? ?pwatcher = new QFutureWatcher<void>; ? ? //把掃描到的wifi信息輸出到指定文件 ? ? QFuture<void> future = QtConcurrent::run([=]() ? ? { ? ? ? ? func(); //耗時(shí)操作 ? ? }); ? ? connect(pwatcher, &QFutureWatcher<void>::finished, this, [=]() ? ? { ? ? ? ? core(); //主線程操作 ? ? }); ? ? pwatcher->setFuture(future);
QtConccurent管理的線程實(shí)際是從線程池分配線程資源的,而綁定QFutureWatcher的槽是在主線程中執(zhí)行的。
在需要單次執(zhí)行且內(nèi)部邏輯較簡單的時(shí)候使用QtConccurrent + QFuture + QFutureWatcher是很方便的,可以減少很多編碼工作量,而且在多cpu環(huán)境中,QtConccurent也會(huì)啟用多核。
Qt異步變同步問題
解決的問題
很多情況會(huì)出現(xiàn)多線程程序,再進(jìn)行操作時(shí)候,其中一個(gè)線程的邏輯執(zhí)行需要另外一個(gè)線程的一個(gè)信號,那么異步變同步就變得無比重要
如何實(shí)現(xiàn)
使用:QEventLoop類
The QEventLoop class provides a means of entering and leaving an event loop.
QEventLoop類提供了一種進(jìn)入和離開事件循環(huán)的方法。
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.
在任何時(shí)候,您都可以創(chuàng)建一個(gè)QEventLoop對象并在其上調(diào)用exec()來啟動(dòng)一個(gè)本地事件循環(huán)。 在事件循環(huán)中,調(diào)用exit()將強(qiáng)制返回exec()。
代碼塊解析
? ? QEventLoop q; ? ? QTimer t; ? ? t.setSingleShot(false); ? ? connect(&t, &QTimer::timeout, this, [=](){ ?? ??? ?//TODO SOMETHING ? ? }); ?? ?connect(this, SIGNAL(connectStatusChangedSig()), &q, SLOT(quit())); ?//異步調(diào)用完成退出 ? ? t.start(50); ? ? q.exec();
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c語言數(shù)據(jù)結(jié)構(gòu)之并查集 總結(jié)
一種用于管理分組的數(shù)據(jù)結(jié)構(gòu)。它具備兩個(gè)操作:(1)查詢元素a和元素b是否為同一組 (2) 將元素a和b合并為同一組,需要的朋友可以參考下2018-08-08C語言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼
24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過加減乘除以及括號運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下2022-08-08基于c++強(qiáng)制類型轉(zhuǎn)換的(總結(jié))詳解
本篇文章對C++中的強(qiáng)制類型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05C++代碼和可執(zhí)行程序在x86和arm上的區(qū)別介紹
這篇文章主要介紹了C++代碼和可執(zhí)行程序在x86和arm上的區(qū)別,X86和ARM是占據(jù)CPU市場的兩大處理器,各有優(yōu)劣,本文給大家詳細(xì)介紹了兩者的區(qū)別,需要的朋友可以參考下2022-07-07