11 qt多线程

QT线程创建的两种方法 一.方法一 1.主线程(TaskProcessing.h和TaskProcessing.cpp) 2.子线程(ThreadWork.h和ThreadWork.cpp) 二.方法二 QT提供的第二种线程的创建方式弥补了第一种方式的缺点,用起来更加灵活,步骤如下: 1.创建一个新的类,让这个类从QObject派生 class ThreadWork:public QObject { … } 2.在这个类中添加一个公共的成员函数,函数体就是要子线程中执行的业务逻辑 class ThreadWork:publ 阅读详情

一个进程里可以有多个子线程,但只能有一个主线程(也有就main开始执行的线程).
主线程退出,其它所有的子线程会随着进程结束而结束,
QT进程的主线程其实就管理窗口的事件处理,当在窗口对象的函数里做死循环或耗时比较久的事情时,会引发界面不响应的状况。所以为了不让用户抓狂,耗时的工作就放在子线程里完成。

Qt里创建子线程有两种方法:

1 封装一个继承QThread的类,并实现虚函数run. 在run函数里写上此线程所作的工作.

    class MyThread : public QThread {
    public:
        void run() {
            //做线程要作的事情
            //此函数执行结束,线程也就退出工作了。所以这个函数通常都是个循环。
        }
    };

创建子线程对象时:

    MyThread * t = new MyThread;
    t->start(); //注意不是直接调用run函数,run函数是在线程启动后自动调用的。
            //调用start函数时,也可以指定线程的优先级别

线程对象与窗口对象通信时,需通过信号与槽的方法。
如实现:
在窗口里点击按钮时,创建出一个子线程并分配它的ID号, 此线程每隔5秒产生一个随机数,并传递给窗口对象(也就发出信号给窗口对象).

 mywin.h
#ifndef MYWIN_H
#define MYWIN_H
#include <QWidget>
#include <QPushButton>
#include <QThread>
class MyThread : public QThread
{
    Q_OBJECT
private:
    int id;
public:
    MyThread(int id); //创建线程对象时需分配ID
    void run();  //线程要做的事情
signals:
    void valGot(QString);  //线程的信号
};
//测试线程的窗口
class MyWin : public QWidget
{
    Q_OBJECT
private:
    QPushButton *btn;
    QList<MyThread *> list; //用于存放线程对象地址的链表
public:
    explicit MyWin(QWidget *parent = 0);
    ~MyWin();
signals:
public slots:
    void slot_btn(); //用于连接按钮的信号
    void slot_thread(QString str); //用于连接线程对象的信号
};
#endif // MYWIN_H
mywin.cpp
#include "mywin.h"
#include <QDebug>
MyThread::MyThread(int id)
{
    this->id = id;
}
void MyThread::run()
{
    int n;
    QString str("id=%1 : val=%2");
    while (1)
    {
        sleep(3);
        n = qrand()%100; //取100内的随机数
        emit valGot(str.arg(id).arg(n));
    }
}
///////////////////
MyWin::MyWin(QWidget *parent) : QWidget(parent)
{
    btn = new QPushButton("new thread", this);
    connect(btn, SIGNAL(clicked(bool)), this, SLOT(slot_btn()));
    resize(320, 240);
}
MyWin::~MyWin()
{
    delete btn;
    //窗口对象退出时,把所有的子线程对象结束工作并回收资源。
    for (int i = 0; i < list.size(); i++ )
    {
        list.at(i)->terminate(); //终止线程对象的工作
        list.at(i)->wait(); //回收线程对象的资源
    }
}
void MyWin::slot_btn()
{
    static int id = 0; //用于分配线程的ID
    MyThread *t;
    t = new MyThread(id++);
    //连接线程对象的信号, 当线程对象的信号发出时,触发槽slot_thread
    connect(t, SIGNAL(valGot(QString)), this, SLOT(slot_thread(QString)));
    list.append(t); //把创建出来的线程对象的地址存入链表
    t->start(QThread::LowPriority); //启动线程,并指定此线程的优先级别比一般的线程要低
}
void MyWin::slot_thread(QString str)
{
    qDebug() << str; //输出线程对象发出的参数
}
main.cpp
#include <QApplication>
#include "mywin.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWin win;
    win.show();
    return a.exec();
}

2 第二种的方法有点像java里实现线程的接口。
首先还是封装一个类,要求必须继承QObject类或它的派生类。其实QT里QObject是所有类的基类,也就是说基本上只要继承一个QT里的类就可以了。
然后必须实现一个槽函数,函数名随便。如:

    class MyThread : public QObject
    {
        Q_OBJECT
    public slots:
        void  myslot();//函数里做线程处理的事件
    }

创建MyThread对象后, 还是需要一个QThread对象来处理事情

    MyThread *t = new MyThread;
    QThread *thread = new QThread;

    t->moveToThread(thread); //指定由线程对象thread来处理。
    //然后再把一个信号连接到MyThread的槽函数myslot
    thread->start();  //最后启动线程
Qt 6.11 多线程创建实战:继承QThread与moveToThread 2种方法性能对比 本文深入对比了Qt 6.11中继承QThread与moveToThread两种多线程创建方法的性能差异。通过CPU密集型和IO密集型任务的实测数据,揭示了继承QThread在计算效率上的优势(2-3%性能提升)以及moveToThread在IO操作中的更好表现(9%耗时降低),为开发者提供了科学的线程技术选型依据和优化建议。 阅读详情

相关推荐

Qt信号槽与C++11 Lambda多线程通信深度对比与实战指南

在多线程编程中,线程安全通信是确保程序稳定运行的核心基础。其原理在于协调不同执行流间的数据交换与状态同步,避免竞态条件和数据不一致。从技术价值看,高效的线程通信机制能显著提升程序并发性能与响应能力,是现代高性能应用的关键。应用场景广泛覆盖GUI界面更新、后台任务处理、实时数据处理等领域。本文聚焦于Qt信号槽与C++11 std::function/Lambda两套主流方案,深入解析其在线程安全、生命周期管理及性能开销上的差异,并结合事件循环、对象亲和性等热词,提供混合使用的最佳实践与避坑指南。

diankui6178的博客 469

QT实现线程操作

1、第一种方法 第一种方法是QT4.8之前的写法,需要重写一个类,继承于QThread类。 1.1、自己实现一个子线程类myThread,并继承于QThread类。 1.2、重写子线程类myThread中的虚函数run()。 1.3、在主线程Widget中定义子线程类对象。 1.4、在主线程Widget中连接信号槽,实现子线程于主线程之前通信。 1.5、主线程Widget中使用子线程的start()方法启动子线程。 项目结构 主线程代码 widget.h #ifndef WID

new9232的博客 1954

Qt修炼手册11_多线程编程和QThread类

1.事件循环 学习QT多线程编程之前,有必要先熟悉事件循环的概念。 先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) {   QApplication app(argc, argv);   // 构造主窗口对象并显示   MainWindow w;   w.show();   // 进入事件循环   return app.exe

沈春旭的博客 4585

Qt创建线程(使moveToThread方法创建子线程)

(4)这种创建线程的方式很灵活,如果子线程不够用,可以把多个任务函数移动到其中的一个线程中,(一个子线程中可以同时关联多个任务函数,关联的多个任务函数是按照线性的顺序执行的)还可以先在线程1中执行任务函数a,然后在线程2中执行任务函数a(也就是一个任务函数可以在多个不同的线程中执行)(1)要使用moveToThread方法必须继承与QObject类。QThread和moveToThread两种方法都可以使用信号和槽。(3)任务类里面的任务函数可以有多个。(2)创建任务对象时不能指定父对象。

weixin_44954230的博客 1800

基于QT的多线程管理机制

目标 本文章基于QT5 c++11的多线程机制,尝试构造一种能够批量新建、关联管理、状态反馈、有序退出的服务模式 类设计 1、多线程服务类ThreadService,承担线程外部对接操作;调用线程初始化操作;装载线程所需数据;调用线程销毁操作;接收线程信号并新建、销毁线程管理队列功能,是外部功能的对接接口和内部线程组的管理模块。 2、线程功能基类,负责实现线程的基础功能,如启动线程运行返回线程开始信号、结束线程销毁装载数据并返回结束信号、记录线程id和线程组关联关系(比如一个操作的多个关联线程称为一个线

qq_52703909的博客 626

Qt_Note5_多线程实战应用

多进程、多线程

qq_45276500的博客 1016

QT 创建线程的三种方法

QT 创建线程的三种方法

wanglei_11的博客 1万+

高德地图 搜索和点击定位

高德地图vue

weixin_45474673的博客 1943

qt中创建子线程最简单的方法(不用新建QThread和QObject的子类)

在主线程中创建一个自定义信号,并用connect来关联QObject子类中的槽函数。将QObject子类对象指针moveToThread到QThread子类的对象指针。回归正题,最简单的创建线程的方法,不需要创建新类,不需要创建新文件。先啰嗦几句,写一下传统的两种方法,最简单创建线程的方式在文章末尾。在主线程中创建QThread子类的对象指针。在主线程中创建QObject子类对象指针。在主线程中创建QThread的对象指针。调用对象指针的start方法。创建QObject的子类,创建QThread的子类。

老薛的专栏 1307

自适应粒子群优化(Adaptive Particle Swarm Optimization,APSO

下面是一个关于自适应粒子群优化(Adaptive Particle Swarm Optimization,APSO)的博客,希望可以帮助您。提示:以下是本篇文章正文内容,下面案例可供参考在上面的代码中,表示粒子的数量,表示解空间的维度,表示迭代次数,表示优化的目标函数。在__init__方法中,我们初始化了粒子群的位置和速度,并将每个粒子的位置作为其最优解,将其适应度值初始化为正无穷。我们还初始化了学习因子和惯性权重的参数。在run方法中,我们迭代了次,计算每个粒子的适应度值和最优解。

weixin_52026057的博客 9914

Claude Code+Cursor+Claude 4三剑合璧!5步搞定Magentic-UI的OAuth2.0集成,开发效率飙升500%,新手秒变全栈工程师

本文详细介绍了如何利用Claude Code、Cursor和Claude 4三款AI工具高效集成Magentic-UI的OAuth2.0认证系统。通过5个步骤的实战演练,开发者可快速完成从环境搭建、项目分析、代码生成到前端集成的全过程,显著提升开发效率。文章还提供了JWT令牌管理、安全配置及常见问题解决方案。

weixin_29234509的博客 453

C++ 11 之多线程(QT实现)

前言: 最近没更新博客啊,主要是我的二叉树算法还在调试,又面临毕业了,各种实验啊,找工作啊,又有了各种的论文啊,实在是没时间了,这几天突发奇想写一下多线程的例子,我试了C的pthread也试了其他的,最后觉得C++11的thread是真的方便,我就写一篇博客介绍一下,因为是QT实现的我就先从QT说起吧。 QT新建一个项目 qt建立一个工程,我建立的是图上的工程。剩下的部分全部点击下一步就好了,没什么特殊关照的。建立好工程之后大家一定要在.pro文件里边看看有没有 CONFIG ...

cheng_jack_li的博客 1666

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5810

C++11、MFC、Qt多线程整理

本周主要研究了多线程编程,包括WIN32 API的多线程编程,MFC框架多线程编程,QT框架中的多线程编程以及C++11中的基于Thread类的多线程。 (1)WIN 32 API编程 首先引入头文件&lt;windows.h&gt;,然后进行线程函数定义:DWORD WINAPI funThread (LPVOID lpParameter); 调用CreateThread函数来启动线程,其中...

千里小马哥的博客 2302

中国高精度年度平均气温栅格数据集(1901-2024)

本文基于中国月度平均气温栅格数据集,计算生成1901-2024年1km分辨率的年度平均气温数据集,并按中国省市行政区划进行裁剪。该数据集融合CRU全球数据和WorldClim高分辨率数据,经496个站点验证,具有高时空精度和长时间序列特点,覆盖全国(含港澳台)逾百年气温记录,为气候变化研究、生态水文分析及农业生产评估等提供重要数据支撑。数据格式为Tif,单位为0.1℃,可获取全国、各省及各市三个尺度的气温栅格数据。

PPdata_Academy的博客 1242

SEED-VIG数据集实战:5步搞定驾驶员疲劳检测模型(附Python代码)

本文提供了一份基于SEED-VIG数据集的驾驶员疲劳检测模型实战指南。通过五个核心步骤——数据准备、特征提取、模型训练、优化评估及部署思路,详细讲解了如何利用脑电信号构建分类器,并附有完整的Python代码,帮助开发者快速上手这一智能座舱关键技术。

w1x2y3的博客 263

11、QT中多线程的使用

方法1:思路图: 直接上代码: 主函数: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QThread> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new U...

qq_42655967的博客 382

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 140

【零基础学QT】【038】Qt多线程框架和C++11多线程框架

使用QThread实现多线程 #include "qlib.h" class PrintThread : public QThread { private: //通过bool来控制运行条件 bool running = true; public: PrintThread() {} //在析构函数中自动结束线程 //很重要,...

天天向上 Up Up Up (*^▽^*) 1468

语言大模型之Tokenization的深入理解

Tokenization(分词)是自然语言处理(NLP)中一个非常重要的步骤,它的目标是将文本转换为模型可以理解的格式。对于像GPT、BERT等大型预训练模型来说,tokenization决定了文本如何转化为数字表示,从而影响模型在不同任务中的表现。接下来我会深入介绍tokenization的过程、不同的tokenization方法,以及它与模型微调(fine-tuning)之间的关系。

JustinMars的博客 341

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

QT C++11多线程

发现qt中加入 LIBS+= pthread 不好使,需要找到解决办法

IQIT 923

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c++11 跨平台多线程demo和qt 静态链接

#include #include #include // std::chrono::seconds #include // std::cout #include // std::thread, std::this_thread::sleep_for //http://www.cnblogs.com/haippy/p/3236136.html void thread_t

云守护的专栏 1084

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Qt信号槽机制与C++11的std::function/Lambda在多线程场景下的优劣势对比如下: 1. 线程安全与跨线程通信 • Qt信号槽 • 优势: ◦ 内置线程安

• 例如,在子线程中使用Lambda处理计算,再通过信号槽将结果发送到主线程更新UI。UI事件处理 ✅ 自动绑定到主线程 ⚠️ 需通过信号槽转发到主线程。• 确保接收者线程有事件循环(QThread::exec())。场景 Qt信号槽 std::function/Lambda。• 同一线程内的简单回调、需要捕获局部变量的临时任务。• 多线程中共享std::function对象需加锁。• 慎用[&]捕获引用,优先使用[=]或显式捕获。通过合理选择机制,可兼顾性能与安全性。• 避免在槽函数中阻塞主线程。

weixin_39291964的博客 256
上一篇: qt超易实现录屏程序的方法
下一篇: 12 qt的反射机制应用
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值