Qt之簡(jiǎn)單的異步操作實(shí)現(xiàn)方法
Qt簡(jiǎn)單的異步操作
在實(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 則允許使用信號(hào)和槽監(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)部邏輯較簡(jiǎn)單的時(shí)候使用QtConccurrent + QFuture + QFutureWatcher是很方便的,可以減少很多編碼工作量,而且在多cpu環(huán)境中,QtConccurent也會(huì)啟用多核。
Qt異步變同步問題
解決的問題
很多情況會(huì)出現(xiàn)多線程程序,再進(jìn)行操作時(shí)候,其中一個(gè)線程的邏輯執(zhí)行需要另外一個(gè)線程的一個(gè)信號(hào),那么異步變同步就變得無比重要
如何實(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對(duì)象并在其上調(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/C++?Qt?StatusBar底部狀態(tài)欄應(yīng)用教程
Qt窗體中默認(rèn)會(huì)附加一個(gè)QstatusBar組件,狀態(tài)欄組件位于主窗體的最下方,其作用是提供一個(gè)工具提示功能。本文主要介紹了StatusBar底部狀態(tài)欄的應(yīng)用教程,需要的同學(xué)可以學(xué)習(xí)一下2021-12-12
通過C++程序示例理解設(shè)計(jì)模式中的外觀模式
這篇文章主要介紹了通過設(shè)計(jì)模式中的外觀模式及相關(guān)的C++程序示例,外觀模式在高層提供了一個(gè)統(tǒng)一的接口實(shí)現(xiàn)一定程度上的解耦,需要的朋友可以參考下2016-03-03

