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博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM