Qt 线程专题,防界面卡顿
推荐使用QtConcurrent,直接上结论代码:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QtConcurrent/QtConcurrent> //引入头文件。pro中引入QT += concurrent,否则卡顿。 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } //线程函数 void MainWindow::hello(QString name) { qDebug()<<"Hello"<<name<<"from"<<QThread::currentThread(); for(int i=0;i<10;i++) { QThread::sleep(1); qDebug("[%s]i=%d",name.data(),i); } } void MainWindow::on_pushButton_clicked() { QFuture<void> f1=QtConcurrent::run(this,&MainWindow::hello,QString("Alice")); //运行函数 QFuture<void> f2=QtConcurrent::run(this,&MainWindow::hello,QString("Bob")); //下方的while循环与waitForFinished都会阻塞程序,执行完毕才会继续往下运行。 //需要立即执行的代码可以写在这里 qDebug()<<"Continue..."; while (!f1.isFinished() && !f2.isFinished()) { //防止窗口卡顿 QApplication::processEvents(); } f1.waitForFinished(); f2.waitForFinished(); qDebug()<<"Game Over"; }
分享gitee上的讲解和案例,这两个要仔细看,很优秀:
tech/QtThread · Weadbm/qt相关 - 码云 - 开源中国 (gitee.com)
Code · Lexi_XL/MultiThreadTest--Qt - 码云 - 开源中国 (gitee.com)
【三种线程方式】
方式一:子类化Qthred
方式二:新建一个QObject,里面放工作函数再moveToThread
方式三:QtConcurrent
关于方式三:
QtConcurrent是一个命名空间而不是一个类,因此其中的所有函数都是命名空间内的全局函数。
QtConcurrent这是一个高级 API,构建于QThreadPool之上,它提供更高层次的函数接口(APIs),使所写的程序,可根据计算机的CPU核数,自动调整运行的线程数量。通常用于处理大多数通用的并行计算模式。
方式一、二有一个共同的缺点:繁杂的参数传递过程,这两个方法都需要将工作函数放在新建的类中,导致当前主线程中的各种属性和全局变量需要使用信号槽传递到子线程。
QtConcurrent就可以不需要使用信号槽来传递参数,直接在当前类里面写工作函数,工作函数可以直接使用当前类的全局变量和属性。
【实践】
方式一、二参考我的git。MultithreadedCV · xixixing/读书_OpenCV3和Qt5计算机视觉应用开发 - 码云 - 开源中国 (gitee.com)
方式三参考Qt最简单的多线程方法QtConcurrent::run()_guo88455648的博客-CSDN博客_qtconcurrent
【参考博客】
最详细的Qt多线程的三种方法之一QThread_苏克贝塔的博客-CSDN博客_qt异步线程
最详细的Qt多线程的三种方法之二QtRunnable::run()+QThreadPool_苏克贝塔的博客-CSDN博客
最详细的Qt多线程的三种方法之三QtConcurrent::run()+QThreadPool_苏克贝塔的博客-CSDN博客_qtconcurrent::run
Qt并发模块Qt Concurrent的使用_Amnesia Greens的博客-CSDN博客_qtconcurrent
【视频】
1、QThread、QtConcurrent方式 [直播录制]Qt多线程相关教学视频_哔哩哔哩_bilibili
2、QThreadPool方式、QRunnable,直接看最后两集 Qt中多线程-线程池的使用-C/C++/qt_哔哩哔哩_bilibili
【问题与措施】
Cannot send events to objects owned by a different thread._qqnnxpp的博客-CSDN博客