日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Qt之簡單的異步操作實(shí)現(xiàn)方法_C 語言

作者:超級小清 ? 更新時(shí)間: 2022-12-10 編程語言

Qt簡單的異步操作

在實(shí)際應(yīng)用中,經(jīng)常會遇到一些耗時(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也會啟用多核。

Qt異步變同步問題

解決的問題

很多情況會出現(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()來啟動一個(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();

原文鏈接:https://blog.csdn.net/nchu_zhangyiqing/article/details/114291400

欄目分類
最近更新