Qt中多线程

在Qt中实现多线程主要有两种常用方式:基于QThread的子类化QObject+moveToThread的Worker模式。以下是详细说明和示例代码:


1. 传统方法:继承 QThread(适用于简单任务)

#include <QThread>
#include <QDebug>class MyThread : public QThread {Q_OBJECT
protected:void run() override {for(int i=0; i<5; i++){qDebug() << "Thread:" << i;sleep(1); // 模拟耗时操作}}
};// 使用方式
MyThread thread;
thread.start(); // 启动线程
thread.wait();  // 等待线程结束(可选)

注意

  • 直接在run()中编写业务逻辑,但不要在此线程中操作GUI组件。
  • Qt4时代的经典方法,Qt5之后推荐Worker模式。

2. 推荐方法:Worker对象 + moveToThread(事件驱动)

#include <QObject>
#include <QThread>
#include <QDebug>class Worker : public QObject {Q_OBJECT
public slots:void doWork() {for(int i=0; i<5; i++){qDebug() << "Worker in thread:" << QThread::currentThreadId();QThread::sleep(1);}emit workFinished();}
signals:void workFinished();
};// 使用方式
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);// 连接信号与槽
QObject::connect(thread, &QThread::started, worker, &Worker::doWork);
QObject::connect(worker, &Worker::workFinished, thread, &QThread::quit);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
QObject::connect(thread, &QThread::finished, worker, &QObject::deleteLater);thread->start(); // 启动线程事件循环

优势

  • 利用Qt的事件循环,避免阻塞线程。
  • 通过信号槽实现线程间通信,天然线程安全。
  • 资源管理更清晰,通过deleteLater自动释放对象。

3. 线程安全与信号槽

  • 跨线程通信:Qt信号槽自动排队(QueuedConnection),无需手动同步。
  • 共享数据保护:使用QMutexLockerQReadWriteLock保护临界区。
// 示例:使用QMutex保护共享数据
QString sharedData;
QMutex mutex;void modifyData() {QMutexLocker locker(&mutex);sharedData = "Modified";
}

4. 线程池(QRunnable)

适用于需要频繁创建/销毁线程的场景:

#include <QRunnable>
#include <QThreadPool>class Task : public QRunnable {void run() override {qDebug() << "Task running in thread pool";}
};// 使用方式
Task *task = new Task;
QThreadPool::globalInstance()->start(task);

关键注意事项

  1. GUI操作限制:所有界面操作必须在主线程完成,通过信号将结果传递回UI线程。
  2. 事件循环:Worker模式依赖线程的事件循环(默认已启动)。
  3. 资源释放:通过finished信号触发deleteLater,避免野指针。
  4. 避免阻塞:耗时应放在子线程,主线程保持响应。

示例场景:后台计算更新进度

// Worker类中定义进度信号
signals:void progressUpdated(int percent);// UI线程连接信号
QObject::connect(worker, &Worker::progressUpdated, [](int value){ progressBar->setValue(value); });

通过上述方法,Qt多线程编程既能保持界面流畅,又能高效利用多核CPU资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从PGC到AIGC:海螺AI多模态内容生成系统架构一站式剖析

海螺AI&#xff1a;基于多模态架构的下一代认知智能引擎 海螺AI核心模型架构基础模型&#xff1a;abab-6.5语音模型&#xff1a;speech-01 视频生成管线关键子系统快速接入海螺AI 蓝耘MaaS平台什么是MaaS平台&#xff1f;支持的大模型蓝耘搭载海螺AI的优势 实战应用教程如何注册…

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时&#xff0c;发现很多题目都用到了二分查找的变种问题&#xff0c;即二分查找上下界问题&#xff0c;例如以下题目&#xff1a; 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

android adjust 卸载与重装监测

想要洞察应用内用户的留存率,可以通过Adjust 的卸载与重装进行监测 名词解释: 卸载:集成完成后,卸载应用,安装状态为:卸载 重装:如果应用已经卸载,但一段时间后又进行安装,则会被视为重装。 📢📢📢:adjust 文件中说到24 小时后,可以再 adjust 控制台看安装…

算法系列——有监督学习——4.支持向量机

一、概述 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种应用范围非常广泛的算法&#xff0c;既可以用于分类&#xff0c;也可以用于回归。 本文将介绍如何将线性支持向量机应用于二元分类问题&#xff0c;以间隔&#xff08;margin&#x…

【Mani_skill】success判断的核心调用逻辑

1. 可视化调用流程&#xff08;from Deepseek-r1-Cursor&#xff09; [RL算法调用 env.step()]↓ 调用 env.get_info()↓ 调用 env.evaluate() → 返回包含 success 的字典↓ 将 success 存入 info 字典↓ 在 step() 中处理终止条件&#xff1a; terminated success | fail

【图像处理基石】什么是HDR图片?

1. 什么是HDR图片&#xff1f; HDR&#xff08;高动态范围图像&#xff0c;High Dynamic Range&#xff09;是一种通过技术手段扩展照片明暗细节的成像方式。以下是关于HDR的详细说明&#xff1a; 核心原理 动态范围&#xff1a;指图像中最亮和最暗区域之间的亮度差。人眼能…

嵌入式笔记 | 正点原子STM32F103ZET6 4 | 中断补充

1. 外设引脚重映射 1.1 定义 在STM32中&#xff0c;每个外设的引脚都有默认的GPIO端口&#xff0c;但有些引脚可以通过重映射寄存器将功能映射到其他端口。这种机制称为引脚重映射&#xff0c;主要用于解决引脚复用冲突或优化PCB布线。 1.2 重映射的类型 部分重映射&#x…

如何选择合适的 AI 模型?(开源 vs 商业 API,应用场景分析)

1. 引言 在 AI 迅猛发展的今天&#xff0c;各类 AI 模型层出不穷&#xff0c;从开源模型&#xff08;如 DeepSeek、Llama、Qwen&#xff09;到商业 API&#xff08;如 OpenAI 的 ChatGPT、Anthropic 的 Claude、Google Gemini&#xff09;&#xff0c;每种方案都有其优势与适用…

攻克 3D 模型网站建设难题,看迪威系统优势

在当今数字化时代&#xff0c;3D 模型广泛应用于建筑设计、游戏开发、工业制造、文化创意等诸多领域。拥有一个功能强大的 3D 模型网站&#xff0c;对于企业展示产品、设计师分享作品、教育机构开展教学等都具有重要意义。然而&#xff0c;构建这样一个网站却并非易事&#xff…

使用uniapp的vite版本进行微信小程序开发,在项目中使用mqtt连接、订阅、发布信息

1、保证在微信公众平台配置socket合法域名 2、项目中使用mqtt 建议在package.json中配置"mqtt": “4.1.0”&#xff0c;使用这个版本的依赖 页面中引入mqtt并配置连接 // ts-ignoreimport * as mqtt from mqtt/dist/mqtt.js; //要使用这里面的const state reacti…

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)

1.问题描述&#xff1a; 使用华为内置的MapComponent&#xff0c; 发现显示不出来。查看日志&#xff0c; MapRender底层有报错。 解决方案&#xff1a; 麻烦按以下步骤检查下地图服务&#xff0c;特别是签名证书指纹那部分。 1.一般没有展示地图&#xff0c;可能和没有配置…

现代复古像素风品牌海报游戏排版设计装饰英文字体 Psygen — Modern Pixel Font

Psygen 是一种像素化等宽字体&#xff0c;具有强烈的复古未来主义和网络风格美学。块状的、基于网格的字体采用了早期的计算机界面、街机游戏排版和 ASCII 艺术。 该字体支持拉丁文、西里尔文和希腊文脚本&#xff0c;使其适用于多语言设计。扩展的字符集还具有唯一的符号和方…

小科普《DNS服务器》

DNS服务器详解 1. 定义与核心作用 DNS&#xff08;域名系统&#xff09;服务器是互联网的核心基础设施&#xff0c;负责将人类可读的域名&#xff08;如www.example.com&#xff09;转换为机器可识别的IP地址&#xff08;如192.0.2.1&#xff09;&#xff0c;从而实现设备间的…

lunar是一款无第三方依赖的公历 python调用

lunar是一款无第三方依赖的公历(阳历)、农历(阴历、老黄历)、佛历和道历工具&#xff0c;支持星座、儒略日、干支、生肖、节气、节日、彭祖百忌、吉神(喜神/福神/财神/阳贵神/阴贵神)方位、胎神方位、冲煞、纳音、星宿、八字、五行、十神、建除十二值星、青龙名堂等十二神、黄道…

力扣hot100——三数之和(双指针)

题目&#xff1a;三数之和 排序 双指针 本题的难点在于如何去除重复解。 算法流程&#xff1a; 1、特判&#xff0c;对于数组长度 n&#xff0c;如果数组为 null 或者数组长度小于 3&#xff0c;返回 []。 2、对数组进行排序。 3、遍历排序后数组&#xff1a; &#xff08…

操作系统为ubantu的服务器上部署nginx软件基础步骤总结

今天在这里&#xff0c;我们总结一下ubantu的服务器上部署nginx软件&#xff0c;请按照以下步骤进行安装&#xff1a; 1、更新包列表&#xff1a; 首先更新你系统中的可用软件包列表&#xff0c;以确保你可以安装最新版本。 sudo apt update2、 Ubuntu上更新已安装软件包&…

记录一次,rabbitmq开启stomp插件之后,还是连不上15674端口的问题

原因是装在docker 里面的rabbitmq 没有映射15674端口&#xff0c;需重新删除容器之后重新运行 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -p 15674:15674 -p 1883:1883 -p 15675:15675 rabbitmq:版本号 进入docker容器开启插件 docker exec -it rabbitm…

MATLAB 控制系统设计与仿真 - 27

状态空间的标准型 传递函数和状态空间可以相互转换&#xff0c;接下来会举例如何有传递函数转成状态空间标准型。 对角标准型 当 G(s)可以写成&#xff1a; 即&#xff1a; 根据上图可知&#xff1a; 约当标准型 当 G(s)可以写成&#xff1a; 即&#xff1a; 根据上图…

1.FastAPI简介与安装

文章目录 为什么选择FastAPI&#xff1f;FastAPI支持的功能FastAPI的安装第一个FastAPI应用运行应用 为什么选择FastAPI&#xff1f; python web开发: Django: 适合大型复杂项目&#xff1b;Flask&#xff1a;适合灵活开发&#xff0c;搭建小型项目&#xff1b;FastAPI: 兼具开…

【MyDB】一个仿照MySQL的轮子项目系列文章汇总

迄今所有系列文章内容如下&#xff1a; 代码位于xianghua-2/MYDB: 一个仿MySQL的简易数据库 1 项目环境配置以及整体项目结构 【MyDB】1-MyDB环境配置及项目结构-CSDN博客 2 TransactionManager事务管理模块 【MyDB】2-TransactionManager 事务管理-CSDN博客 3 DataManage…