Qt多线程练习(一)

1.要求

在这里插入图片描述
界面布局如上图所示。

创建 3 个子线程。

点击 开始 按钮后,第一个子线程生成 n n n 个随机数,返回给主线程,主线程再将这个 n n n 个随机数显示出来;

接着,第二个线程,第三个线程分别对生成的 n n n 个随机数做 冒泡排序 和 快速排序,返回给主线程,主线程再将排好序的 n n n 个数显示出来;

快速排序

2.实现效果

在这里插入图片描述
在这里插入图片描述

3.实现

1.第一种方式

分别定义三个线程类,GenerateThreadBubbleSortThreadQuickSortThread,都继承自QThread,再分别重写各自的 run方法。

  • GenerateThread重写 run方法,生成 n n n 个随机数,返回给主线程;
  • BubbleSortThread重写 run方法,将GenerateThread生成 n n n 个随机数进行 冒泡排序,排序之后返回给主线程;
  • QuickSortThread重写 run方法,将GenerateThread生成 n n n 个随机数进行 快速排序,排序之后返回给主线程;

为了方便,三个线程类都定义在同一个文件 mythread.h中。

mythread.h

#ifndef GENERATETHREAD_H
#define GENERATETHREAD_H

#include <QThread>
#include <QVector>

class GenerateThread : public QThread
{
    Q_OBJECT
public:
    explicit GenerateThread(QObject *parent = nullptr);

    void run() override;

public slots:
    //接收创建随机数的数量
    void receive_count(int _n);

signals:
    //生成随机数之后,发送信号给主线程
    void sendRandomList(QVector<int> randomList);
private:
    int n;
};

class BubbleSortThread : public QThread
{
    Q_OBJECT
public:
    explicit BubbleSortThread(QObject *parent = nullptr);

    void run() override;

public slots:
    //接收主线程传递过来的 list
    void receive_list(QVector<int> list);

signals:
    //冒泡排序之后,把数据发送给主线程
    void finish(QVector<int> bubbleList);
private:
    QVector<int> _list;
};

class QuickSortThread : public QThread
{
    Q_OBJECT
public:
    explicit QuickSortThread(QObject *parent = nullptr);

    void run() override;

public slots:
    //接收主线程传递过来的 list
    void receive_list(QVector<int> list);


signals:
    //快速排序之后,把数据发送给主线程
    void finish(QVector<int> quickList);
private:
    QVector<int> _list;

    //快速排序的方法
    void quick_sort(int l,int r,QVector<int>& nums);
};

#endif // GENERATETHREAD_H

mythread.cpp

#include "mythread.h"
#include <QVector>
#include <QElapsedTimer>
#include <QDebug>
#include <QTime>

/*****************生成随机数**********************/
GenerateThread::GenerateThread(QObject *parent) : QThread(parent)
{

}

void GenerateThread::receive_count(int _n){
    n = _n;
}

void GenerateThread::run(){
    //加入随机数种子,按时间随机
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    qDebug()<<"生成随机数线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    QVector<int> arr(n);
    for(int i = 0;i < n;i++){
        arr[i] = qrand() % 100000;
    }
    qDebug()<<"生成 "<<n<<" 个随机数总共消耗的时间 : "<<timer.elapsed()<<"ms";
    emit sendRandomList(arr);
}

/*****************生成随机数**********************/


/*****************冒泡排序**********************/
BubbleSortThread::BubbleSortThread(QObject *parent) : QThread(parent)
{

}

void BubbleSortThread::receive_list(QVector<int> list){
    _list = list;
}

void BubbleSortThread::run(){

    qDebug()<<"冒泡排序线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    int n = _list.size();

    //冒泡排序
    for(int i = 0;i < n;i++){
        for(int j = i + 1;j < n;j++){
            if(_list[i] > _list[j]){
                int temp = _list[i];
                _list[i] = _list[j];
                _list[j] = temp;
            }
        }
    }

    qDebug()<<"冒泡排序消耗的时间为 : "<<timer.elapsed()<<"ms";
    emit finish(_list);
}

/*****************冒泡排序**********************/


/*****************快速排序**********************/

QuickSortThread::QuickSortThread(QObject *parent) : QThread(parent)
{

}

void QuickSortThread::receive_list(QVector<int> list){
    _list = list;
}

//快速排序
void QuickSortThread::quick_sort(int l,int r,QVector<int>& nums){
    //只有一个元素,就直接返回
    if(l >= r) return;

    qSwap(nums[l] , nums[l + qrand() % (r - l + 1) ]);

    int x = nums[l];
    int i = l , j = r;
    while(i < j){
        while(i < j && nums[j] > x) j--;
        if(i < j) nums[i++] = nums[j];
        while(i < j && nums[i] < x) i++;
        if(i < j) nums[j--] = nums[i];
    }
    nums[i] = x;
    quick_sort(l , i - 1 , nums);
    quick_sort(i + 1 , r , nums);
}

void QuickSortThread::run(){

    qDebug()<<"快速排序线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    int n = _list.size();

    //快速排序
    quick_sort(0 , n - 1 , _list);

    qDebug()<<"快速排序消耗的时间为 : "<<timer.elapsed()<<"ms";
    emit finish(_list);
}

/*****************快速排序**********************/

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    //发送信号给子线程,指定生成 _n 个随机数
    void start_generate_random(int _n);


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "mythread.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    GenerateThread * generateThread = new GenerateThread();

    BubbleSortThread * bubbleSortThread = new BubbleSortThread();

    QuickSortThread * quickSortThread = new QuickSortThread();

    //点击按钮,把指定生成随机数个数的信号发给子线程 ; 再启动子线程生成随机数

    connect(this,&MainWindow::start_generate_random,generateThread,&GenerateThread::receive_count);

    connect(ui->startBtn,&QPushButton::clicked,this,[=](){
        //生成 10000 个随机数
        emit start_generate_random(10000);

        //启动生成随机数的子线程
        generateThread->start();
    });

    //将随机数生成线程产生的数据,发送到另外两个排序子线程
    connect(generateThread,&GenerateThread::sendRandomList,bubbleSortThread,&BubbleSortThread::receive_list);
    connect(generateThread,&GenerateThread::sendRandomList,quickSortThread,&QuickSortThread::receive_list);

    //子线程生成随机数之后,会发送信号给主线程,主线程再将生成的随机数显示到控件中
    connect(generateThread,&GenerateThread::sendRandomList,this,[=](QVector<int> list){

        //启动两个排序子线程
        bubbleSortThread->start();
        quickSortThread->start();

        //把生成的随机数都添加到randomList中,让它显示出来
        for(int i = 0;i < list.size();i++){
            ui->randomList->addItem(QString::number(list.at(i)));
        }
    });

    //冒泡排序结束后,将排好序的数据发送到主线程,主线程将其显示到控件中
    connect(bubbleSortThread,&BubbleSortThread::finish,this,[=](QVector<int> list){
        for(int i = 0;i < list.size();i++){
            ui->bubbleList->addItem(QString::number(list.at(i)));
        }
    });

    //快速排序结束后,将排好序的数据发送到主线程,主线程将其显示到控件中
    connect(quickSortThread,&QuickSortThread::finish,this,[=](QVector<int> list){
        for(int i = 0;i < list.size();i++){
            ui->quickList->addItem(QString::number(list.at(i)));
        }
    });

    //资源释放
    connect(this,&MainWindow::destroyed,this,[=](){
        generateThread->quit();
        generateThread->wait();
        generateThread->deleteLater();

        bubbleSortThread->quit();
        bubbleSortThread->wait();
        bubbleSortThread->deleteLater();

        quickSortThread->quit();
        quickSortThread->wait();
        quickSortThread->deleteLater();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}



main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<QVector<int>>("QVector<int>");
    MainWindow w;
    w.show();
    return a.exec();
}

2.第二种方式

分别定义三个 任务类(注意:此时已经不是线程类)GenerateThreadBubbleSortThreadQuickSortThread,都继承自QObject,再分别定义实现各自的 work(不一定是 work,名字随意定义)方法。

  • GenerateThread实现work方法,生成 n n n 个随机数,返回给主线程;
  • BubbleSortThread实现work方法,将GenerateThread生成 n n n 个随机数进行 冒泡排序,排序之后返回给主线程;
  • QuickSortThread实现 work方法,将GenerateThread生成 n n n 个随机数进行 快速排序,排序之后返回给主线程;

新建三个线程对象 t1 , t2 , t3。把GenerateThreadBubbleSortThreadQuickSortThread任务对象分别移动到 三个线程t1 , t2 , t3中,按照流程启动线程。

mythread.h

#ifndef GENERATETHREAD_H
#define GENERATETHREAD_H

#include <QObject>
#include <QVector>

class GenerateThread : public QObject
{
    Q_OBJECT
public:
    explicit GenerateThread(QObject *parent = nullptr);

    void work(int n);
signals:
    //生成随机数之后,发送信号给主线程
    void sendRandomList(QVector<int> randomList);
};

class BubbleSortThread : public QObject
{
    Q_OBJECT
public:
    explicit BubbleSortThread(QObject *parent = nullptr);

    void work(QVector<int> list);
signals:
    //冒泡排序之后,把数据发送给主线程
    void finish(QVector<int> bubbleList);
};

class QuickSortThread : public QObject
{
    Q_OBJECT
public:
    explicit QuickSortThread(QObject *parent = nullptr);

    void work(QVector<int> list);

signals:
    //快速排序之后,把数据发送给主线程
    void finish(QVector<int> quickList);
private:
    //快速排序的方法
    void quick_sort(int l,int r,QVector<int>& nums);
};

#endif // GENERATETHREAD_H


mythread.cpp

#include "mythread.h"
#include <QVector>
#include <QElapsedTimer>
#include <QDebug>
#include <QTime>
#include <QThread>

/*****************生成随机数**********************/
GenerateThread::GenerateThread(QObject *parent) : QObject(parent)
{

}


void GenerateThread::work(int n){
    //加入随机数种子,按时间随机
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    qDebug()<<"生成随机数线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    QVector<int> arr(n);
    for(int i = 0;i < n;i++){
        arr[i] = qrand() % 100000;
    }
    qDebug()<<"生成 "<<n<<" 个随机数总共消耗的时间 : "<<timer.elapsed()<<"ms";
    emit sendRandomList(arr);
}

/*****************生成随机数**********************/


/*****************冒泡排序**********************/
BubbleSortThread::BubbleSortThread(QObject *parent) : QObject(parent)
{

}

void BubbleSortThread::work(QVector<int> list){

    qDebug()<<"冒泡排序线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    int n = list.size();

    //冒泡排序
    for(int i = 0;i < n;i++){
        for(int j = i + 1;j < n;j++){
            if(list[i] > list[j]){
                int temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }

    qDebug()<<"冒泡排序消耗的时间为 : "<<timer.elapsed()<<"ms";
    emit finish(list);
}

/*****************冒泡排序**********************/


/*****************快速排序**********************/

QuickSortThread::QuickSortThread(QObject *parent) : QObject(parent)
{

}

//快速排序
void QuickSortThread::quick_sort(int l,int r,QVector<int>& nums){
    //只有一个元素,就直接返回
    if(l >= r) return;

    qSwap(nums[l] , nums[l + qrand() % (r - l + 1) ]);

    int x = nums[l];
    int i = l , j = r;
    while(i < j){
        while(i < j && nums[j] > x) j--;
        if(i < j) nums[i++] = nums[j];
        while(i < j && nums[i] < x) i++;
        if(i < j) nums[j--] = nums[i];
    }
    nums[i] = x;
    quick_sort(l , i - 1 , nums);
    quick_sort(i + 1 , r , nums);
}

void QuickSortThread::work(QVector<int> list){

    qDebug()<<"快速排序线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    int n = list.size();

    //快速排序
    quick_sort(0 , n - 1 , list);

    qDebug()<<"快速排序消耗的时间为 : "<<timer.elapsed()<<"ms";
    emit finish(list);
}

/*****************快速排序**********************/

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    //发送信号给子线程,指定生成 _n 个随机数
    void start_generate_random(int _n);


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "mythread.h"

#include<QThread>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.新建任务对象
    GenerateThread * generateThread = new GenerateThread();

    BubbleSortThread * bubbleSortThread = new BubbleSortThread();

    QuickSortThread * quickSortThread = new QuickSortThread();

    //2.新建三个线程
    QThread * t1 = new QThread();
    QThread * t2 = new QThread();
    QThread * t3 = new QThread();

    //3.把任务对象移到子线程中
    generateThread->moveToThread(t1);
    bubbleSortThread->moveToThread(t2);
    quickSortThread->moveToThread(t3);

    //点击按钮,把指定生成随机数个数的信号发给子线程 ; 再启动子线程生成随机数

    connect(this,&MainWindow::start_generate_random,generateThread,&GenerateThread::work);

    connect(ui->startBtn,&QPushButton::clicked,this,[=](){
        //生成 10000 个随机数
        emit start_generate_random(10000);

        //启动生成随机数的子线程
        t1->start();
    });

    //将随机数生成线程产生的数据,发送到另外两个排序子线程
    connect(generateThread,&GenerateThread::sendRandomList,bubbleSortThread,&BubbleSortThread::work);
    connect(generateThread,&GenerateThread::sendRandomList,quickSortThread,&QuickSortThread::work);

    //子线程生成随机数之后,会发送信号给主线程,主线程再将生成的随机数显示到控件中
    connect(generateThread,&GenerateThread::sendRandomList,this,[=](QVector<int> list){

        //启动两个排序子线程
        t2->start();
        t3->start();

        //把生成的随机数都添加到randomList中,让它显示出来
        for(int i = 0;i < list.size();i++){
            ui->randomList->addItem(QString::number(list.at(i)));
        }
    });

    //冒泡排序结束后,将排好序的数据发送到主线程,主线程将其显示到控件中
    connect(bubbleSortThread,&BubbleSortThread::finish,this,[=](QVector<int> list){
        for(int i = 0;i < list.size();i++){
            ui->bubbleList->addItem(QString::number(list.at(i)));
        }
    });

    //快速排序结束后,将排好序的数据发送到主线程,主线程将其显示到控件中
    connect(quickSortThread,&QuickSortThread::finish,this,[=](QVector<int> list){
        for(int i = 0;i < list.size();i++){
            ui->quickList->addItem(QString::number(list.at(i)));
        }
    });

    //资源释放
    connect(this,&MainWindow::destroyed,this,[=](){
        t1->quit();
        t1->wait();
        t1->deleteLater();

        t2->quit();
        t2->wait();
        t2->deleteLater();

        t3->quit();
        t3->wait();
        t3->deleteLater();

        generateThread->deleteLater();

        bubbleSortThread->deleteLater();

        quickSortThread->deleteLater();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<QVector<int>>("QVector<int>");
    MainWindow w;
    w.show();
    return a.exec();
}

3.第三种方式

使用 Qt 内置的线程池对象 QThreadPool

分别定义三个 任务类(注意:此时已经不是线程类)GenerateThreadBubbleSortThreadQuickSortThread,都继承自QObjectQRunnable,再分别重写各自的 run方法。

  • GenerateThread重写run方法,生成 n n n 个随机数,返回给主线程;
  • BubbleSortThread重写run方法,将GenerateThread生成 n n n 个随机数进行 冒泡排序,排序之后返回给主线程;
  • QuickSortThread重写 run方法,将GenerateThread生成 n n n 个随机数进行 快速排序,排序之后返回给主线程;

使用线程池的静态方法 QThreadPool::globalInstance()->start(任务对象),把GenerateThreadBubbleSortThreadQuickSortThread任务对象分别扔到线程池中执行任务。

mythread.h

#ifndef GENERATETHREAD_H
#define GENERATETHREAD_H

#include <QRunnable>
#include <QObject>
#include <QVector>

class GenerateThread : public QObject , public QRunnable
{
    Q_OBJECT
public:
    explicit GenerateThread(QObject *parent = nullptr);

    void run() override;

public slots:
    //接收创建随机数的数量
    void receive_count(int _n);

signals:
    //生成随机数之后,发送信号给主线程
    void sendRandomList(QVector<int> randomList);
private:
    int n;
};

class BubbleSortThread : public QObject , public QRunnable
{
    Q_OBJECT
public:
    explicit BubbleSortThread(QObject *parent = nullptr);

    void run() override;

public slots:
    //接收主线程传递过来的 list
    void receive_list(QVector<int> list);

signals:
    //冒泡排序之后,把数据发送给主线程
    void finish(QVector<int> bubbleList);
private:
    QVector<int> _list;
};

class QuickSortThread : public QObject , public QRunnable
{
    Q_OBJECT
public:
    explicit QuickSortThread(QObject *parent = nullptr);

    void run() override;

public slots:
    //接收主线程传递过来的 list
    void receive_list(QVector<int> list);


signals:
    //快速排序之后,把数据发送给主线程
    void finish(QVector<int> quickList);
private:
    QVector<int> _list;

    //快速排序的方法
    void quick_sort(int l,int r,QVector<int>& nums);
};

#endif // GENERATETHREAD_H

mythread.cpp

#include "mythread.h"
#include <QVector>
#include <QElapsedTimer>
#include <QDebug>
#include <QThread>
#include <QTime>

/*****************生成随机数**********************/
GenerateThread::GenerateThread(QObject *parent) : QObject(parent),QRunnable()
{
    //设置任务事件执行结束之后自动析构
    setAutoDelete(true);
}

void GenerateThread::receive_count(int _n){
    n = _n;
}

void GenerateThread::run(){
    //加入随机数种子,按时间随机
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    qDebug()<<"生成随机数线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    QVector<int> arr(n);
    for(int i = 0;i < n;i++){
        arr[i] = qrand() % 100000;
    }
    qDebug()<<"生成 "<<n<<" 个随机数总共消耗的时间 : "<<timer.elapsed()<<"ms";
    emit sendRandomList(arr);
}

/*****************生成随机数**********************/


/*****************冒泡排序**********************/
BubbleSortThread::BubbleSortThread(QObject *parent) : QObject(parent),QRunnable()
{
    //设置任务事件执行结束之后自动析构
    setAutoDelete(true);
}

void BubbleSortThread::receive_list(QVector<int> list){
    _list = list;
}

void BubbleSortThread::run(){

    qDebug()<<"冒泡排序线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    int n = _list.size();

    //冒泡排序
    for(int i = 0;i < n;i++){
        for(int j = i + 1;j < n;j++){
            if(_list[i] > _list[j]){
                int temp = _list[i];
                _list[i] = _list[j];
                _list[j] = temp;
            }
        }
    }

    qDebug()<<"冒泡排序消耗的时间为 : "<<timer.elapsed()<<"ms";
    emit finish(_list);
}

/*****************冒泡排序**********************/


/*****************快速排序**********************/

QuickSortThread::QuickSortThread(QObject *parent) : QObject(parent),QRunnable()
{
    //设置任务事件执行结束之后自动析构
    setAutoDelete(true);
}

void QuickSortThread::receive_list(QVector<int> list){
    _list = list;
}

//快速排序
void QuickSortThread::quick_sort(int l,int r,QVector<int>& nums){
    //只有一个元素,就直接返回
    if(l >= r) return;

    qSwap(nums[l] , nums[l + qrand() % (r - l + 1) ]);

    int x = nums[l];
    int i = l , j = r;
    while(i < j){
        while(i < j && nums[j] > x) j--;
        if(i < j) nums[i++] = nums[j];
        while(i < j && nums[i] < x) i++;
        if(i < j) nums[j--] = nums[i];
    }
    nums[i] = x;
    quick_sort(l , i - 1 , nums);
    quick_sort(i + 1 , r , nums);
}

void QuickSortThread::run(){

    qDebug()<<"快速排序线程的地址 "<<QThread::currentThread();
    QElapsedTimer timer;
    timer.start();

    int n = _list.size();

    //快速排序
    quick_sort(0 , n - 1 , _list);

    qDebug()<<"快速排序消耗的时间为 : "<<timer.elapsed()<<"ms";
    emit finish(_list);
}

/*****************快速排序**********************/

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    //发送信号给子线程,指定生成 _n 个随机数
    void start_generate_random(int _n);


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "mythread.h"

#include <QThreadPool>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1.新建任务对象
    GenerateThread * generateThread = new GenerateThread();

    BubbleSortThread * bubbleSortThread = new BubbleSortThread();

    QuickSortThread * quickSortThread = new QuickSortThread();

    //2.把任务对象扔到 线程池 中开始执行即可

    //点击按钮,把指定生成随机数个数的信号发给子线程 ; 再启动子线程生成随机数

    connect(this,&MainWindow::start_generate_random,generateThread,&GenerateThread::receive_count);

    connect(ui->startBtn,&QPushButton::clicked,this,[=](){
        //生成 10000 个随机数
        emit start_generate_random(10000);

        //把生成随机数的任务对象扔到 线程池 中执行
        QThreadPool::globalInstance()->start(generateThread);
    });

    //将随机数生成线程产生的数据,发送到另外两个排序子线程
    connect(generateThread,&GenerateThread::sendRandomList,bubbleSortThread,&BubbleSortThread::receive_list);
    connect(generateThread,&GenerateThread::sendRandomList,quickSortThread,&QuickSortThread::receive_list);

    //子线程生成随机数之后,会发送信号给主线程,主线程再将生成的随机数显示到控件中
    connect(generateThread,&GenerateThread::sendRandomList,this,[=](QVector<int> list){

        //把 两个排序的任务对象 扔到 线程池 中执行
        QThreadPool::globalInstance()->start(bubbleSortThread);
        QThreadPool::globalInstance()->start(quickSortThread);

        //把生成的随机数都添加到randomList中,让它显示出来
        for(int i = 0;i < list.size();i++){
            ui->randomList->addItem(QString::number(list.at(i)));
        }
    });

    //冒泡排序结束后,将排好序的数据发送到主线程,主线程将其显示到控件中
    connect(bubbleSortThread,&BubbleSortThread::finish,this,[=](QVector<int> list){
        for(int i = 0;i < list.size();i++){
            ui->bubbleList->addItem(QString::number(list.at(i)));
        }
    });

    //快速排序结束后,将排好序的数据发送到主线程,主线程将其显示到控件中
    connect(quickSortThread,&QuickSortThread::finish,this,[=](QVector<int> list){
        for(int i = 0;i < list.size();i++){
            ui->quickList->addItem(QString::number(list.at(i)));
        }
    });

    //线程池会自动释放资源,我们不需要管理
}

MainWindow::~MainWindow()
{
    delete ui;
}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<QVector<int>>("QVector<int>");
    MainWindow w;
    w.show();
    return a.exec();
}

4.建议

推荐使用第二种方式 或者 第三种线程池的方式。

  • 第二种方式相比于第一种,精简了很多代码;
  • 第三种方式使用线程池来管理线程,效率更高,而且我们不用管理资源释放;

参考视频

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值