QT不阻塞UI的方式

ops/2024/10/18 8:32:21/

方法1:QtConcurrent

#include <QtConcurrent>
#include <QFuture>
#include <QFutureWatcher>
#include <QDebug>void longRunningTask() {// 模拟耗时操作QThread::sleep(5);
}void startTask() {QFuture<void> future = QtConcurrent::run(longRunningTask);QFutureWatcher<void> *watcher = new QFutureWatcher<void>();QObject::connect(watcher, &QFutureWatcher<void>::finished, []() {qDebug() << "Task finished, update UI here.";// 在这里更新UI});watcher->setFuture(future);
}

方法2:QEventLoop

QEventLoop loop;
QTimer::singleShot(milliseconds, &loop, &QEventLoop::quit);
loop.exec();

方法3:thread

std::thread th1(function);
th1.detach();

方法4:async

#include <iostream>
#include <future>
#include <chrono>// 模拟一个耗时的计算任务
int longRunningTask(int id, int duration) {std::cout << "Task " << id << " started, will take " << duration << " seconds." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(duration)); // 模拟耗时任务std::cout << "Task " << id << " completed." << std::endl;return id * duration;  // 返回一些计算结果
}int main() {// 使用std::async启动两个异步任务std::future<int> result1 = std::async(std::launch::async, longRunningTask, 1, 3);std::future<int> result2 = std::async(std::launch::async, longRunningTask, 2, 2);std::cout << "Main thread continues to run..." << std::endl;// 在主线程做其他事情for (int i = 0; i < 5; ++i) {std::cout << "Main thread working..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}// 获取异步任务的结果int value1 = result1.get();  // 这时如果任务尚未完成,主线程会阻塞在此int value2 = result2.get();std::cout << "Result of task 1: " << value1 << std::endl;std::cout << "Result of task 2: " << value2 << std::endl;return 0;
}

http://www.ppmy.cn/ops/94283.html

相关文章

FFmpeg源码:av_clip、av_clip64宏定义分析

一、av_clip宏定义 av_clip是宏&#xff0c;定义在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0.1&#xff09;的头文件libavutil/common.h中。当标识符“av_clip”没有由#define定义过时&#xff0c;编译代码段&#xff1a;#define av_clip av_clip_c&#xff0c;…

2024【十大品牌网】发布|车载WiFi十大品牌排行榜

自驾游无法随时随地联网?货车司机流量不够用&#xff1f;网约车线上抢单网速不好&#xff1f;来看看最新发布的车载WiFi十大品牌排行榜&#xff0c;帮你解决网速慢、流量不够用的问题&#xff01; 1.格行 格行作为有15年历史的老牌物联网企业&#xff0c;在产品质量和服务上…

二、OpenCVSharp 中的图像读取、显示与保存

文章目录 前言一、从不同来源读取图像1. 文件(各种常见图像格式)2. 摄像头3. 网络流二、图像的显示1. 使用默认窗口显示2. 自定义窗口的大小、位置和标题3. 多图像在同一窗口的显示布局三、图像的保存1. 保存为不同格式2. 保存时的质量设置前言 在图像处理中,图像的读取、显…

【HeadFirst 设计模式】工厂模式的C++实现

文章目录 简单工厂模式一、案例背景二、案例分析三、代码分析 工厂方法模式一、案例背景二、案例分析三、代码分析 抽象工厂模式一、案例背景二、案例分析三、代码分析 简单工厂模式 一、案例背景 你是小镇上最有名的一家披萨店的店主&#xff0c;你们店里的披萨广受人们喜爱…

58 mysql 存储引擎之 MEMORY

前言 我们这里来看一下 MEMORY 存储引擎, 我们常见的那些 临时表什么的, 都是基于 MEMORY 在之前 我们也曾经调试过 相关内存临时表的信息 它主要是 使用 hp_scan, hp_find_record 等等 api 来操作内存中的信息 我们这里基于 information_schema.TABLES 这张基于 MEMORY 的…

Rvt/dgn格式的模型如何提取外轮廓,用于压平倾斜模型或者地形,进行BIM+GIS融合

0序 很多设计院、施工单位都需要做BIMGIS的融合&#xff0c;把设计成果或者施工方案和现状实景做叠加。 BIM作为设计模型和现状的实景是不吻合的&#xff0c;多数都需要在现状的基础上进行改造&#xff0c;穿过村落的桥梁&#xff0c;已有立交的跨域等。为了更好的展示设计方案…

AQS源码解析(2)-共享锁的获取与释放

大家好&#xff0c;我是呼噜噜&#xff0c;好久没聊关于Java并发&#xff0c;本文接着上一篇文章图解ReentrantLock的基石AQS源码-独占锁的获取与释放&#xff0c;将继续聊聊AQS共享锁获取与释放的一些细节 共享锁与独占锁的区别 首先我们先了解知道共享锁与独占锁的区别&…

解决antd TreeSelect 返回值不包含父节点问题 -自定义组件(react)

在写一个表单时使用了antd的 TreeSelect&#xff0c;在对TreeSelect的值提交时发现&#xff0c;父节点的值在半选状态时未提交&#xff0c;在选中状态时&#xff08;子节点全选&#xff09;&#xff0c;子节点不提交&#xff0c;只提交父节点&#xff0c;这与后端需求不符&…