Qt 线程管理:从 QThread 到 QThreadPool

在 Qt 中,多线程开发主要围绕QThread(底层控制)和QThreadPool(效率复用)展开。

  • QThread

    :手动管理线程生命周期,适用于常驻后台任务。

  • QThreadPool

    :自动管理线程池,适用于大量短时、并行的耗时任务。

三种实现方案对比

特性

moveToThread (推荐)

子类化 QThread

线程池 (QThreadPool)

生命周期

手动管理

手动管理

自动回收
开销

较高 (每任务一线程)

较高

极低 (线程复用)
解耦度

极高

适用场景

网络通信、常驻监控

底层控制、死循环

扫描任务、高并发计算


一、 线程生命周期与控制 (QThread)

1. 启动与退出

  • start()

    :启动线程,触发started()信号。

  • exit(int)

    /quit():告诉线程的事件循环退出。

  • terminate()

    危险操作!强制终止线程,可能导致资源未释放或死锁。

2. 状态与内存

  • isRunning()

    /isFinished():查询状态。

  • wait()

    :阻塞等待线程结束。

  • 自动释放

    :建议connect(thread, &QThread::finished, thread, &QObject::deleteLater);


二、 方案一:moveToThread (推荐)

核心思想:通过moveToThread将逻辑类(Worker)推向指定的QThread

// 在控制器中应用 Worker *worker = new Worker; worker->moveToThread(&workerThread); connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater); connect(this, &Controller::operate, worker, &Worker::doWork); workerThread.start();

三、 方案二:子类化 QThread (传统)

核心思想:重写run()函数。注意:QThread 对象本身在旧线程,只有run()内部在新线程。

classWorkerThread : public QThread { voidrun()override{ // 新线程执行逻辑 emit resultReady("done"); exec(); // 开启事件循环 } };

四、 技术深究:事件循环与异步通知

1. 跨线程信号槽

Qt 默认使用Queued Connection:信号发送后入队,接收者在自己的线程循环中异步执行槽函数。

2. 高频数据通知

对于高并发采集,可结合QWaitConditionQApplication::postEvent()实现生产者-消费者模式,平衡采集与处理的压力。


五、 方案三:线程池 (QThreadPool)

核心思想:在程序启动时创建一组线程重复使用,避免频繁创建/销毁线程的系统开销。

1. 核心用法:QRunnable

要使用线程池,需要子类化QRunnable并实现run()

classMyTask : public QRunnable { voidrun()override{ qDebug() << "任务在线程" << QThread::currentThreadId() << "运行"; } }; // 提交任务 QThreadPool::globalInstance()->start(newMyTask());

2. 管理与优化

  • 全全局实例

    QThreadPool::globalInstance()访问预定义的全局池。

  • 自动删除

    QThreadPool默认会自动delete已完成的QRunnable

  • 限额控制

    setMaxThreadCount()设置并发上限(默认值为 CPU 核心数)。

  • 过期回收

    :闲置 30 秒后的线程会自动销毁(可通过setExpiryTimeout修改)。

3. 实战案例:IP 地址扫描器

classScanIpTask : public QRunnable { public: QString ip; ScanIpTask(QString addr) : ip(addr) {} voidrun()override{ int exitCode = QProcess::execute("ping", {"-n", "1", ip}); qDebug() << ip << (exitCode == 0 ? "存活" : "无法访问"); } }; // 批量提交 for(int i=0; i<255; i++) { auto task = newScanIpTask(QString("192.168.1.%1").arg(i)); QThreadPool::globalInstance()->start(task); }

六、 实战建议与注意事项

1. UI 限制

  • 严禁

    :在非 GUI 线程直接操作界面控件。

2. 资源安全

  • 多线程共享数据时,必须使用QMutexQReadWriteLockQSemaphore进行保护。

3. 工具备忘

  • QThread::currentThreadId()

    :定位当前线程。

  • QThread::idealThreadCount()

    :获取 CPU 理想并发数。

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

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

相关文章

AnimeGANv2从零开始:构建二次元转换器完整流程

AnimeGANv2从零开始&#xff1a;构建二次元转换器完整流程 1. 引言 1.1 学习目标 本文将带你从零开始&#xff0c;完整实现一个基于 AnimeGANv2 的照片转二次元动漫风格系统。你将掌握&#xff1a; AnimeGANv2 的核心原理与轻量化设计优势如何部署并运行一个支持人脸优化的…

物理约束机器学习赋能科学计算

物理约束机器学习赋能科学计算 研究人员从有限体积法中汲取灵感&#xff0c;并调整神经算子&#xff0c;以在物理系统的深度学习模型中强制执行守恒定律和边界条件。 深度学习方法在科学计算领域也展现出前景&#xff0c;可用于预测偏微分方程的解。这些方程通常数值求解成本高…

彻底解析Java访问修饰符:public、private、protected及默认的区别

文章目录彻底解析 Java 访问修饰符&#xff1a;public、private、protected 及默认的区别&#xff1f;什么是访问修饰符&#xff1f;第一部分&#xff1a;public&#xff08;公共的&#xff09;public 的作用范围public 的应用场景示例代码第二部分&#xff1a;private&#xf…

AnimeGANv2代码实例:Python调用模型避坑指南

AnimeGANv2代码实例&#xff1a;Python调用模型避坑指南 1. 引言 1.1 项目背景与技术价值 随着深度学习在图像生成领域的快速发展&#xff0c;风格迁移&#xff08;Style Transfer&#xff09;技术已从早期的神经网络艺术化处理演进到如今高度精细化的动漫风格转换。其中&am…

一键部署通义千问2.5-7B-Instruct,AI应用开发从未如此简单

一键部署通义千问2.5-7B-Instruct&#xff0c;AI应用开发从未如此简单 1. 引言&#xff1a;为什么选择通义千问2.5-7B-Instruct&#xff1f; 随着大模型技术的快速演进&#xff0c;开发者对高效、轻量且可商用的本地化推理模型需求日益增长。在这一背景下&#xff0c;通义千问…

手把手教程:用通义千问2.5-7B和vLLM实现代码补全功能

手把手教程&#xff1a;用通义千问2.5-7B和vLLM实现代码补全功能 1. 学习目标与前置知识 本文将带领读者从零开始&#xff0c;使用 通义千问2.5-7B-Instruct 模型结合 vLLM 推理框架&#xff0c;搭建一个高效的本地化代码补全系统。通过本教程&#xff0c;您将掌握&#xff1…

Windows 10/11 优化大师 Windows Manager

一、前言&#xff1a;为什么 Windows 10/11 越用越卡&#xff1f; 相信很多朋友都有这样的体验&#xff1a; 新装的 Windows 10 / Windows 11 用着很流畅用了一段时间后&#xff1a; 开机变慢系统反应迟钝后台服务越来越多磁盘空间被莫名其妙占满 即便你不安装乱七八糟的软…

hal_uart_transmit支持多协议切换的控制系统设计方案

基于hal_uart_transmit的多协议动态切换系统设计&#xff1a;从理论到实战在嵌入式控制系统中&#xff0c;我们常常面临一个看似简单却极具挑战的现实问题&#xff1a;如何让一块MCU通过同一个UART接口&#xff0c;与使用不同通信协议的多个外设稳定“对话”&#xff1f;比如&a…

AnimeGANv2实战:动漫风格社交媒体广告

AnimeGANv2实战&#xff1a;动漫风格社交媒体广告 1. 引言 随着人工智能技术在图像生成领域的不断突破&#xff0c;将现实世界的照片转化为具有艺术风格的数字作品已成为可能。其中&#xff0c;AnimeGANv2 作为专为“照片转二次元动漫”设计的轻量级生成对抗网络&#xff08;…

access数据库损坏后的修复方法

access数据库是微软Office套件里的“轻量级”关系型数据库&#xff0c;特别适合个人或小团队处理结构化数据。它最大的优势是‌零代码上手‌——通过可视化操作就能完成数据管理&#xff0c;同时支持VBA编程实现复杂功能。“轻量级”“关系型”基本上把Access的应用场景和特征说…

QProcess调用外部程序

在桌面应用开发中&#xff0c;调用外部程序是绑定不开的需求&#xff1a;执行系统命令、调用 FFmpeg 转码、启动 Git 操作……很多开发者习惯用 system("command") 一行解决&#xff0c;却不知道这种写法会阻塞整个线程&#xff0c;让 GUI 界面卡成 PPT。 Qt 提供的…

VibeThinker-1.5B值得部署吗?数学与编程双项评测教程

VibeThinker-1.5B值得部署吗&#xff1f;数学与编程双项评测教程 1. 引言&#xff1a;小参数模型的推理新星 随着大模型训练成本不断攀升&#xff0c;业界对高效、低成本的小参数模型关注度日益提升。微博开源的 VibeThinker-1.5B 正是在这一背景下诞生的一款实验性但极具潜力…

AnimeGANv2如何实现美颜效果?人脸优化算法深度解析

AnimeGANv2如何实现美颜效果&#xff1f;人脸优化算法深度解析 1. 技术背景与问题提出 近年来&#xff0c;AI驱动的图像风格迁移技术在艺术化图像生成领域取得了显著进展。其中&#xff0c;将真实人物照片转换为二次元动漫风格的应用场景尤为受欢迎&#xff0c;广泛应用于社交…

微博开源模型实战:VibeThinker-1.5B WEBUI界面使用详解

微博开源模型实战&#xff1a;VibeThinker-1.5B WEBUI界面使用详解 1. 引言 1.1 业务场景描述 随着大模型在数学推理与代码生成领域的广泛应用&#xff0c;如何在有限算力条件下实现高效、低成本的推理能力成为中小团队和开发者关注的核心问题。微博近期开源的 VibeThinker-…

导师推荐!8款AI论文软件测评,本科生毕业论文必备

导师推荐&#xff01;8款AI论文软件测评&#xff0c;本科生毕业论文必备 2026年AI论文工具测评&#xff1a;如何选出最适合本科生的写作助手 随着人工智能技术在学术领域的深入应用&#xff0c;越来越多的本科生开始借助AI论文软件提升写作效率。然而&#xff0c;面对市场上琳琅…

VibeVoice-TTS模型更新机制:版本升级与回滚操作

VibeVoice-TTS模型更新机制&#xff1a;版本升级与回滚操作 1. 引言 1.1 业务场景描述 随着语音合成技术在播客、有声书、虚拟助手等长文本多角色对话场景中的广泛应用&#xff0c;对TTS系统在长序列生成能力、多说话人一致性以及自然对话流控制方面的要求日益提升。VibeVoi…

Keil环境下51单片机流水灯代码生成操作指南

从零开始点亮第一盏灯&#xff1a;Keil环境下51单片机流水灯实战全记录还记得你第一次看到LED闪烁时的兴奋吗&#xff1f;那种“我写的代码真的在控制物理世界”的震撼感&#xff0c;是每个嵌入式工程师都无法忘记的起点。今天&#xff0c;我们就从最经典的项目——流水灯入手&…

VibeThinker-1.5B-WEBUI权限管理:多用户场景下的配置建议

VibeThinker-1.5B-WEBUI权限管理&#xff1a;多用户场景下的配置建议 1. 引言 1.1 业务场景描述 随着轻量级大模型在开发者社区的广泛应用&#xff0c;VibeThinker-1.5B-WEBUI 因其低成本、高推理效率的特点&#xff0c;逐渐成为个人开发者和小型团队进行数学推导与编程辅助…

零基础玩转通义千问2.5:7B-Instruct模型保姆级部署教程

零基础玩转通义千问2.5&#xff1a;7B-Instruct模型保姆级部署教程 1. 引言 随着大语言模型技术的快速演进&#xff0c;Qwen2.5 系列在2024年9月正式发布&#xff0c;标志着中等体量模型在性能与实用性上的又一次飞跃。其中&#xff0c;通义千问2.5-7B-Instruct 作为该系列的…

【性能测试】2_JMeter _JMeter文件目录

文章目录一、Bin目录二、docs目录三、printable_docs目录四、lib目录一、Bin目录 Bin目录:存放可执行文件和配置文件。 examples&#xff1a;目录下包含Jmeter使用实例ApacheJMeter.jar&#xff1a;JMeter源码包jmeter.bat&#xff1a;windows下启动文件jmeter.sh&#xff1a…