非AI生成,觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
目录
-
什么是多线程?
多线程就是在一个程序里同时跑多个任务,让原本排队干的活儿能“分头行动”,从而提升效率和响应速度。线程是进程里的小工作单元,一个进程可以包含多个线程,它们共享同一份内存和系统资源,但能独立执行不同任务 。多线程编程技术对于提升软件性能和用户体验非常重要,它是我们编程中必须熟练掌握的基本技能。
-
Qt中如何使用多线程?
Qt提供了4种使用多线程的方式,程序员可以根据业务场景和需求灵活使用,一般而言,短期任务优先使用QRunnable和QtConcurrent,长期任务优先使用QThread和moveToThread;需要使用信号槽机制优先使用QThread和moveToThread,不需要使用信号槽机制优先使用QRunnable和QtConcurrent。注意:QRunnable因为不是QObject的子类,默认不支持信号槽机制,但可以持有一个QObject对象,通过这个QObject对象来间接使用信号槽机制。
-
继承QThread
推荐场景:
1.长期存在的线程
2.精确控制线程生命周期
3.自己维护事件循环
不推荐场景:
1.普通后台计算
2.短期任务
优点:能够使用信号槽机制
-
继承QRunnable
推荐场景:
1.大量短任务
2.并发任务(下载、解析、计算)
3.不关心线程细节
4.希望自动复用线程
不推荐场景:
1.需要信号槽(要额外 QObject)
2.需要取消 / 暂停
3.长期运行任务
优点:轻量,自动线程复用,性能友好
-
moveToThread
推荐场景:
1.后台逻辑复杂
2.需要信号槽
3.需要生命周期管理
4.需要多个槽函数在同一线程执行
5.网络 / 数据库 / 设备控制
不推荐场景:
1.简单的一次性任务
2.临时计算
优点:
完全符合 Qt 事件模型
线程安全
架构清晰
这也是官方推荐的多线程使用方式
-
QtConcurrent
推荐场景:
1.简单后台任务
2.不想管线程
3.一次性计算
4.C++ 风格代码
5.快速实现原型
不推荐场景:
1.复杂状态
2.需要取消 / 进度反馈(除非配合 QFutureWatcher)
3.长生命周期线程
优点:
代码最少
不用管线程
架构清晰
不容易出错
-
-
使用方式比较

-
一个完整的示例
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

1万+

被折叠的 条评论
为什么被折叠?



