Qt中的4种多线程使用方式

非AI生成,觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
 

目录

什么是多线程?

Qt中如何使用多线程?

继承QThread

继承QRunnable

moveToThread

QtConcurrent

使用方式比较​编辑

一个完整的示例


  1. 什么是多线程?

    多线程就是在一个程序里同时跑多个任务‌,让原本排队干的活儿能“分头行动”,从而提升效率和响应速度。线程是进程里的小工作单元,一个进程可以包含多个线程,它们共享同一份内存和系统资源,但能独立执行不同任务 。‌‌‌多线程编程技术对于提升软件性能和用户体验非常重要,它是我们编程中必须熟练掌握的基本技能。
     
  2. Qt中如何使用多线程?

    Qt提供了4种使用多线程的方式,程序员可以根据业务场景和需求灵活使用,一般而言,短期任务优先使用QRunnable和QtConcurrent,长期任务优先使用QThread和moveToThread;需要使用信号槽机制优先使用QThread和moveToThread,不需要使用信号槽机制优先使用QRunnable和QtConcurrent。注意:QRunnable因为不是QObject的子类,默认不支持信号槽机制,但可以持有一个QObject对象,通过这个QObject对象来间接使用信号槽机制。

    1. 继承QThread
      推荐场景:
      1.长期存在的线程
      2.精确控制线程生命周期
      3.自己维护事件循环

      不推荐场景:
      1.普通后台计算
      2.短期任务

      优点:能够使用信号槽机制

       
    2. 继承QRunnable
      推荐场景:
      1.大量短任务
      2.并发任务(下载、解析、计算)
      3.不关心线程细节
      4.希望自动复用线程

      不推荐场景:
      1.需要信号槽(要额外 QObject)
      2.需要取消 / 暂停
      3.长期运行任务

      优点:轻量,自动线程复用,性能友好

       
    3. moveToThread
      推荐场景:
      1.后台逻辑复杂
      2.需要信号槽
      3.需要生命周期管理
      4.需要多个槽函数在同一线程执行
      5.网络 / 数据库 / 设备控制

      不推荐场景:
      1.简单的一次性任务
      2.临时计算

      优点:

      完全符合 Qt 事件模型
      线程安全
      架构清晰
      这也是官方推荐的多线程使用方式 
       
    4. QtConcurrent
      推荐场景:
      1.
      简单后台任务
      2.不想管线程
      3.一次性计算
      4.C++ 风格代码
      5.快速实现原型

      不推荐场景:
      1.
      复杂状态
      2.需要取消 / 进度反馈(除非配合 QFutureWatcher)
      3.长生命周期线程

      优点:
      代码最少
      不用管线程
      架构清晰
      不容易出错
  3. 使用方式比较

  4. 一个完整的示例

    ui_mainwindow.h

    /********************************************************************************
    ** Form generated from reading UI file 'mainwindow.ui'
    **
    ** Created by: Qt User Interface Compiler version 6.6.3
    **
    ** WARNING! All changes made in this file will be lost when recompiling UI file!
    ********************************************************************************/
    
    #ifndef UI_MAINWINDOW_H
    #define UI_MAINWINDOW_H
    
    #include <QtCore/QVariant>
    #include <QtWidgets/QApplication>
    #include <QtWidgets/QFrame>
    #include <QtWidgets/QGridLayout>
    #include <QtWidgets/QLabel>
    #include <QtWidgets/QMainWindow>
    #include <QtWidgets/QMenuBar>
    #include <QtWidgets/QStatusBar>
    #include <QtWidgets/QVBoxLayout>
    #include <QtWidgets/QWidget>
    
    QT_BEGIN_NAMESPACE
    
    class Ui_MainWindow
    {
    public:
        QWidget *centralwidget;
        QGridLayout *gridLayout;
        QFrame *frame1;
        QVBoxLayout *verticalLayout;
        QLabel *label;
        QLabel *lblThread1;
        QFrame *frame2;
        QVBoxLayout *verticalLayout_2;
        QLabel *label_3;
        QLabel *lblThread2;
        QFrame *frame3;
        QVBoxLayout *verticalLayout_3;
        QLabel *label_5;
        QLabel *lblThread3;
        QFrame *frame4;
        QVBoxLayout *verticalLayout_4;
        QLabel *label_7;
        QLabel *lblThread4;
        QMenuBar *menubar;
        QStatusBar *statusbar;
    
        void setupUi(QMainWindow *MainWindow)
        {
            if (MainWindow->objectName().isEmpty())
                MainWindow->setObjectName("MainWindow");
            MainWindow->resize(800, 600);
            centralwidget = new QWidget(MainWindow);
            centralwidget->setObjectName("centralwidget");
            gridLayout = new QGridLayout(cent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值