多线程刷新UI, 用QThreadPool和QRunnable实现

Qt子线程刷新主线程界面 问题: 之前做了一个界面,16个线程会刷新主界面的控件,莫名其妙的就崩溃了,还是偶发性,也不知道啥原因,看Qt报的错误信息是“QWidget::repaint: Recursive repaint detected” 查找原因: 看了两个Stack Overflow的问答, https://stackoverflow.com/questions/31180660/qwidgetrepaint-recursive-repaint-detected https://stackoverflow.com/q. 阅读详情

线程池QThreadPool实现多线程, 信号槽实现异步线程刷新UI控件

启动效果

调用是没有问题

这里本来是想打印出线程ID, 不知道怎么用

QString(QThread::currentThread()

输出, 怎么转换成QString


文档结构


线程类

printtask.h

#ifndef PRINTTASK_H
#define PRINTTASK_H
#include <QObject>
#include <QRunnable>
class PrintTask : public QObject, public QRunnable
{
    Q_OBJECT
signals:
    void notify(QString);
public:
    PrintTask();
    ~PrintTask();
protected:
    void run();
signals:
    //注意!要使用信号,采用QObejct 和 QRunnable多继承,记得QObject要放在前面
    void mySignal();
};
#endif // PRINTTASK_H

printtask.cpp

#include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl;
PrintTask::PrintTask()
{
}
PrintTask::~PrintTask()
{
}
//线程真正执行的内容
void PrintTask::run()
{
    QString printf;
    printf = tr("PrintTask run called");
    //printf.append(QString(QThread::currentThread()));
    //cout << "PrintTask run 被调用,调用线程ID为:" << QThread::currentThread() << endl;
    emit notify(printf);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public slots:
   void notify(QString print);
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl;
PrintTask::PrintTask()
{
}
PrintTask::~PrintTask()
{
}
//线程真正执行的内容
void PrintTask::run()
{
    QString printf;
    printf = tr("PrintTask run called");
    //printf.append(QString(QThread::currentThread()));
    //cout << "PrintTask run 被调用,调用线程ID为:" << QThread::currentThread() << endl;
    emit notify(printf);
}


这里的传送类型可以随便设置, int 或者 QString.

C++多线程(1)——Qt利用多线程更新进度条 这样在MyQtWork中管理一个QThread对象,对外部调用者来说非常方便,不用再管理一个QThread指针的new和delete【这里参考了一篇文章的做法,见末尾】。很多文章在主程序中临时变量new一个QThread对象指针,并用到了QThread::deleteLater来自动释放new出来的QThread指针,那么在这种情况下就不要再手动delete了,程序会崩溃的。我一般的习惯是new和delete配对使用,所以就不采用这种方法了。 阅读详情

相关推荐

Qt多线程编程实战:QThread、QRunnable与moveToThread深度解析

在GUI应用开发中,主线程阻塞导致的界面卡顿是常见挑战,其核心在于事件循环机制。为解决这一问题,多线程技术应运而生,它允许耗时操作在后台执行,从而保持界面响应流畅。Qt框架提供了多种线程实现方案,每种方案都有其设计哲学与适用场景。QThread通过继承重写run()方法,适合封装独立后台服务;QRunnable结合QThreadPool,以轻量级任务为单位,适合处理大量短期并行计算;而moveToThread则通过分离对象与线程的亲和性,优雅地支持信号槽通信,成为处理复杂交互后台任务的首选。理解这些方案的原

weixin_30616969的博客 339

Qt高级系列之8:Qt多线程线程池数据同步机制及文件下载器项目实战

1.带领您深入学习QT5/C++:Qt多线程线程池及数据同步机制 ,多线程文件下载器项目实战,继承自QThread,继承自QObject,QRunnable和QThreadPool,QtConcurrent,Qt多线程技术与数据加锁保护机制:QMutex,QSemaphore,QReadWriteLock,QWaitCondition;Qt线程池技术、Qt数据库连接池、等。2.所有章节均有理论知识介绍、接口讲解、实例代码讲解,讲解过程中不断穿插老师在开发过程中遇到的问题及解决方法(可以下载所有的电子课件与源码)。

利用qthread与信号槽构建后台任务系统

通过QThread与信号槽机制,高效构建线程安全的后台任务系统,提升应用响应能力。深入解析QThread的使用技巧与注意事项,结合信号槽实现主线程与工作线程的无缝通信。

weixin_35307279的博客 718

Qt线程之QRunnable的使用详解

概述 说到线程通常会想到QThread,但其实Qt中创建线程的方式有多种,这里主要介绍其中一种QRunnable,QRunnable和QThread用法有些不同,并且使用场景也有区别。接下来就来看看QRunnable的用法、使用场景以及注意事项。 用法 要使用QRunnable创建线程,步骤如下: 继承QRunnable。和QThread使用一样, 首先需要将你的线程类继承于QRunnable。...

luoyayun361的专栏 2万+

Qt多线程与多进程编程实战:从核心原理到避坑指南

并发编程是现代软件开发中提升应用响应能力和处理效率的核心技术。其基本原理在于通过多线程或多进程机制,让程序能够同时执行多个任务,从而有效解决用户界面卡顿与后台繁重计算之间的矛盾。在桌面应用、嵌入式系统及工业控制等领域,合理的并发设计能显著优化用户体验和系统吞吐量。Qt框架为此提供了一整套优雅的跨平台工具,其中,信号槽机制与事件循环是其实现线程间安全通信的基石。通过Worker Object配合MoveToThread等推荐范式,开发者可以构建出清晰、健壮的多线程架构。本文聚焦于Qt并发编程的实战应用,深入剖

weixin_33806914的博客 315

Qt框架开发实战:从核心原理到跨平台应用

跨平台开发框架是现代软件开发的重要基础设施,Qt作为基于C++的成熟解决方案,通过元对象系统和信号槽机制实现了类型安全的组件通信。其分层架构设计分离了平台抽象层与业务逻辑,使开发者既能获得原生性能,又能保持代码跨平台一致性。在工业控制、医疗设备等嵌入式领域,Qt的图形视图框架和高效内存管理显著提升了复杂界面的渲染性能。通过QtConcurrent模块实现的多线程数据处理,在金融分析等计算密集型场景中可带来8倍以上的性能提升。本文以实际项目经验为基础,深入解析Qt核心模块的最佳实践,包括中文编码处理、部署打包

weixin_30945039的博客 395

QT 更新UI的3种方式

【代码】QT 更新UI的3种方式。

dwm88888888的博客 1638

Qt5与OpenCV4计算机视觉开发实战指南

计算机视觉技术通过算法处理和理解图像视频数据,其核心原理包括图像处理、特征提取和模式识别等。OpenCV作为开源计算机视觉库,提供了丰富的图像处理函数和机器学习算法,而Qt框架则擅长构建跨平台GUI应用。两者结合能高效开发兼具强大视觉处理能力和友好交互界面的应用,在工业检测、智能安防、医疗影像等领域有广泛应用。本文以Qt5和OpenCV4开发实战为例,详细解析环境配置、视频处理框架设计、特征检测算法选型等关键技术点,并分享多线程优化、内存管理等工程实践技巧,帮助开发者快速构建高性能计算机视觉应用。

weixin_30629653的博客 342

【QT】继承QRunnable+QThreadPool实现多线程

往期链接: 《QThread源码浅析》 《子类化QThread实现多线程》 《子类化QObject+moveToThread实现多线程》 本文章实例的源码地址:https://gitee.com/CogenCG/QThreadExample.git 继承QRunnable+QThreadPool实现多线程的方法个人感觉使用的相对较少,在这里只是简单介绍下使用的方法。我们可以根据使用的场景来选择方法。 此方法和QThread的区别: 与外界通信方式不同。由于QThread是继承于QObject的,但QR

weixin_43894927的博客 756

Python Qt6快速入门-Qt线程与避免GUI阻塞

PyQt一种图形化用户界面(Graphical User Interface)框架,在PyQt应用程序中,有一个主线程(Main Thread)用于事件循环和GUI刷新。如果在主线程中执行长时间任务,可能会造成GUI冻结或阻塞直到任务结束。在GUI冻结或阻塞期间,用户不能与应用程序交互,这将导致非糟糕的用户体验。Qt框架的QThread可以解决这一问题。在本文中,将详细介绍如何使用QThread来避免GUI冻结或阻塞。

视觉与物联智能 1798

qt编程_在子线程中更新UI界面

qt编程_在子线程中更新UI界面

PyQt5多线程UI更新方法

PyQt5多线程实现UI不卡顿的解决方案:通过QThread类实现耗时任务与UI分离,利用信号槽机制进行线程间通信。核心要点包括:1)创建继承QThread的线程类,重写run方法执行耗时操作;2)通过自定义信号传递数据更新UI;3)主线程接收信号更新界面组件。示例展示了进度条更新的完整流程,强调UI操作必须放在主线程,并提供了线程生命周期管理的最佳实践。其他方案还包括QRunnable、threading模块和concurrent.futures,根据任务特点选择合适方案,同时需遵守不在子线程直接操作UI

HRD的博客 1475

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 290

告别卡顿!用PyQt5的QThreadPool和信号槽,轻松搞定GUI后台任务

本文详细介绍了如何利用PyQt5的QThreadPool和信号槽机制解决GUI界面卡顿问题。通过多线程技术将耗时任务移至后台执行,同时保持界面流畅响应,特别适合文件下载等场景。文章包含完整代码示例和性能优化技巧,帮助开发者轻松实现高效的多线程GUI应用。

weixin_30607659的博客 264

雾化器硬件设计:从N155驱动到PCB可量产实现

雾化器是典型的机电一体化嵌入式终端,其硬件设计本质是电源完整性、信号完整性与热-机械协同的系统工程。核心在于理解高压脉冲驱动原理(如2.4MHz固定频率匹配压电谐振)、电源域隔离机制(AGND/DGND/PGND分域设计)及约束驱动的PCB转化逻辑。技术价值体现在电气可靠性(如OTP/OLP保护)、生产可制造性(DFM合规焊盘与钢网)与环境鲁棒性(三防漆、散热过孔)。典型应用场景覆盖加湿器、医疗雾化仪与工业微流控设备。本文聚焦超声波雾化控制板的硬线实现路径,深入解析N155驱动芯片选型、网络标签工程误用陷阱

weixin_35649491的博客 615

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 616

Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

重要: GUI线程和辅助线程如前所述,每个程序在启动时都有一个线程。这个线程被称为“主线程”(在Qt应用程序中也称为“GUI线程”)。Qt GUI必须在这个线程中运行。所有小部件和几个相关类(例如QPixmap)都不能在辅助线程中工作。辅助线程通常称为“工作线程”,因为它用于从主线程卸载处理工作。 首先,子线程不能创建与UI有关的对象,但是可以这样子做.只能在子线程中发一个信号到主线程中,由主线程创建对话窗口.子线程发完信号后,在子线程中while循环调用事件循环,.对话窗口退出之后,主线程调用接口,结

u011555996的博客 3068

2026年佰维存储数字IC笔试试卷带答案

建立时间是有效时钟沿到来前,输入数据必须稳定保持的最短时间。保持时间是有效时钟沿到来后,输入数据必须继续稳定保持的最短时间。

Open 103

【Qt从入门到入土】6.Qt多线程机制

我们都知道Qt的GUI线程(),在主线程内进行复杂,高速的刷新等操作会使得界面假死(即白屏,未响应状态),这时候就需要创建子线程,将复杂操作交给子线程来处理。每个线程都有一个自己的事件循环!!!

m0_59770307的博客 415

基于YOLOv10的机器人抓取引导系统:从物体检测到精准抓取

python# 数据标注工具简化版import os"""启动标注工具""""""标注单张图像"""print(f"标注图像: {os.path.basename(img_path)}")print("请在图像上绘制抓取矩形框...")# 这里应该实现交互式标注界面# 简化版本直接返回示例标注# 示例标注数据"""保存标注结果"""# 保存为YOLO格式# 转换为YOLO格式。

YOLO 377

《UDS协议从入门到精通》系列——图解0x85:控制DTC的设置

如何让ECU停止或恢复DTC状态位更新?有哪些注意点?图解+示例教你快速上手UDS 0x85服务!!

车载系统攻城狮 3861

PyDebloatX开发解析:用Python和PySide6构建GUI应用的实践

PyDebloatX是一个基于Python和PySide6构建的Windows 10预装应用卸载工具,它提供了直观的图形界面,让用户能够轻松管理和卸载系统预装应用。本文将深入解析如何使用Python和PySide6开发这样一个功能完整的GUI应用程序。 ## 项目架构概览 PyDebloatX采用了清晰的模块化结构,主要分为以下几个核心部分: - **主界面模块**:[pydebloatx/

gitblog_00701的博客 420

Spring Boot集成ShardingSphere实现数据加密及数据脱敏 | Spring Cloud 48

利用ShardingSphere实现: - 数据加密 - 数据脱敏

gmHappy 1万+

qt多线程操作

Qt多线程操作摘要 Qt框架中,主线程同时处理UI和业务逻辑会导致界面卡顿。解决方案是采用多线程,将耗时任务放到子线程中执行。本文介绍了三种Qt多线程实现方式: QThread子类化:继承QThread并重写run()方法,适合简单任务但不推荐常规使用。 Worker对象+moveToThread(推荐):创建QObject派生类作为工作对象,使用moveToThread()将其移至子线程,通过信号槽通信,更符合Qt事件模型。 QRunnable+QThreadPool:配合线程池使用,适合大量短任务,高效

2301_80672443的博客 900

【DRAM存储器六十五】DDR5介绍--训练相关之MPC、Read Training Pattern、Read Preamble Training Mode

简述DDR5 MPC操作和读训练时颗粒输出pattern的配置

highman110的博客 361

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PyQt6桌面应用开发实战与源码解析

PyQt6是Qt官方推出的Python GUI开发框架,基于Qt 6的跨平台能力,为开发者提供了构建现代化桌面应用的完整工具链。其核心原理是通过Python绑定Qt的C++库,实现信号槽机制、模型视图架构等GUI编程范式。相比PyQt5,PyQt6在API设计上更加规范,对高DPI显示和多线程处理有更好支持。在工程实践中,PyQt6特别适合开发数据可视化工具、企业管理系统等需要复杂交互的桌面应用。本文通过一个生产级项目模板,详解PyQt6的工程化实践,包含SQLite数据库操作、无图标界面方案等实用技巧,并

weixin_34417183的博客 320

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: Qt SqliteHelper , QSqlDatabase和QSqlQuery实现
下一篇: Qt 创建文件 用QFile和QDir类
Empty_Android
博客等级 码龄10年 98粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值