1.要求
界面布局如上图所示。
创建 3 个子线程。
点击 开始 按钮后,第一个子线程生成 n n n 个随机数,返回给主线程,主线程再将这个 n n n 个随机数显示出来;
接着,第二个线程,第三个线程分别对生成的 n n n 个随机数做 冒泡排序 和 快速排序,返回给主线程,主线程再将排好序的 n n n 个数显示出来;
2.实现效果
3.实现
1.第一种方式
分别定义三个线程类,GenerateThread
、BubbleSortThread
、QuickSortThread
,都继承自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.第二种方式
分别定义三个 任务类(注意:此时已经不是线程类),GenerateThread
、BubbleSortThread
、QuickSortThread
,都继承自QObject
,再分别定义实现各自的 work
(不一定是 work
,名字随意定义)方法。
GenerateThread
实现work
方法,生成 n n n 个随机数,返回给主线程;BubbleSortThread
实现work
方法,将GenerateThread
生成 n n n 个随机数进行 冒泡排序,排序之后返回给主线程;QuickSortThread
实现work
方法,将GenerateThread
生成 n n n 个随机数进行 快速排序,排序之后返回给主线程;
新建三个线程对象 t1 , t2 , t3
。把GenerateThread
、BubbleSortThread
、QuickSortThread
任务对象分别移动到 三个线程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
。
分别定义三个 任务类(注意:此时已经不是线程类),GenerateThread
、BubbleSortThread
、QuickSortThread
,都继承自QObject
和 QRunnable
,再分别重写各自的 run
方法。
GenerateThread
重写run
方法,生成 n n n 个随机数,返回给主线程;BubbleSortThread
重写run
方法,将GenerateThread
生成 n n n 个随机数进行 冒泡排序,排序之后返回给主线程;QuickSortThread
重写run
方法,将GenerateThread
生成 n n n 个随机数进行 快速排序,排序之后返回给主线程;
使用线程池的静态方法 QThreadPool::globalInstance()->start(任务对象)
,把GenerateThread
、BubbleSortThread
、QuickSortThread
任务对象分别扔到线程池中执行任务。
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.建议
推荐使用第二种方式 或者 第三种线程池的方式。
- 第二种方式相比于第一种,精简了很多代码;
- 第三种方式使用线程池来管理线程,效率更高,而且我们不用管理资源释放;