[Qt5] 使用QtConcurrent::run在异步线程中执行耗时函数

2024-08-28 01:52

本文主要是介绍[Qt5] 使用QtConcurrent::run在异步线程中执行耗时函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. QtConcurrent::run异步线程操作


一. QtConcurrent::run异步线程操作

在Qt中,使用QtConcurrent::run来在异步线程中执行耗时操作,并将结果发送回主线程进行后续处理,是一种非常高效且简洁的方式。

以下是一个基于这种设计的C++流程示例:

1、 定义耗时函数

首先,你需要一个耗时函数,这个函数将在后台线程中被执行。

#include <QDebug>  
#include <QThread>  // 假设的耗时函数  
int longRunningTask(int input) {  // 模拟耗时操作  QThread::sleep(5); // 假设这个函数需要5秒钟来完成  qDebug() << "Task completed in thread" << QThread::currentThreadId();  return input * 2; // 假设的处理结果  
}

2、 使用QtConcurrent::run执行耗时函数

在你的主线程(通常是GUI线程)中,使用QtConcurrent::run来异步执行这个耗时函数。

#include <QtConcurrent>  
#include <QFutureWatcher>  // ... 在某个函数或方法中 ...  // 调用耗时函数  
int input = 10;  
QFuture<int> future = QtConcurrent::run(longRunningTask, input);  // 创建一个QFutureWatcher来监视future的状态  
QFutureWatcher<int> *watcher = new QFutureWatcher<int>();  
QObject::connect(watcher, &QFutureWatcher<int>::finished, [=]() {  // 当任务完成时,这里会被调用  if (watcher->result() != -1) { // 假设-1是某种错误码  int result = watcher->result();  qDebug() << "Result received in main thread:" << result;  // 在这里进行后续操作,使用result  }  watcher->deleteLater(); // watcher对象在任务完成后不再需要,使用deleteLater()来确保它会被适当地清理掉  
});  watcher->setFuture(future); // 将future与watcher关联起来,让watcher开始监视future的状态

代码结尾的watcher->setFuture(future);是将QFutureWatcher对象watcherQFuture对象future关联起来。QFutureWatcher是一个模板类,用于监视QFuture对象的状态变化。当你调用QtConcurrent::run()时,它会返回一个QFuture对象,该对象代表了异步操作的结果。通过调用setFuture()方法,你可以让QFutureWatcher开始监视这个QFuture对象。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。

这篇关于[Qt5] 使用QtConcurrent::run在异步线程中执行耗时函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113399

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa