步骤:
- 新建一个线程类,让其继承于QThread
- 重写QThread类中的 run 函数(private : void run(){生成随机数})
- 子线程 写一个槽函数 接收主线程 传过来的控制数据
- 子线程的事情做完之后,将处理好的数据发送给主线程
注意:
QThread::wait()函数阻塞的不是QThread对象,阻塞的是对象所在的线程,通常是主线程
Code:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "mythread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
MyThread *gen;
BubbleSort *bubble;
QuickSort *quick;
~Widget();
private slots:
void on_butStart_clicked();
private:
Ui::Widget *ui;
signals:
void starting(int num);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"
#include <QString>
#include <QDebug>
#include <QThread>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
gen = new MyThread;
bubble = new BubbleSort;
quick = new QuickSort;
connect(this,&Widget::starting,gen,&MyThread::recvNum);
connect(gen,&MyThread::sendArray,bubble,&BubbleSort::finish);
connect(gen,&MyThread::sendArray,quick,&QuickSort::finish);
connect(gen,&MyThread::sendArray,[=](QVector<int> list){
bubble->start();
quick->start();
for(int i=0;i<list.size();i++)
{
ui -> randList -> addItem( QString::number( list.at(i) ));
}
});
connect(bubble,&BubbleSort::sendArray,[=](QVector<int> list){
for(int i=0;i<list.size();i++)
{
ui ->buluList -> addItem( QString::number( list.at(i) ));
}
});
connect(quick,&QuickSort::sendArray,[=](QVector<int> list){
for(int i=0;i<list.size();i++)
{
ui -> quitList -> addItem( QString::number( list.at(i) ));
}
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_butStart_clicked()
{
gen->start();
emit starting(10000);
}
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QVector>
class MyThread: public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
void recvNum(int num);
protected:
void run() override;
private:
int m_num;
signals:
void sendArray(QVector<int> array);
};
class BubbleSort: public QThread
{
Q_OBJECT
public:
explicit BubbleSort(QObject *parent = nullptr);
void finish(QVector<int> list);
private:
void buluSort(QVector<int> &s);
protected:
void run() override;
private:
QVector<int> m_list;
signals:
void sendArray(QVector<int> array);
};
class QuickSort: public QThread
{
Q_OBJECT
public:
explicit QuickSort(QObject *parent = nullptr);
void finish(QVector<int> list);
void Swap(int &a, int &b);
private:
void quickSorts(QVector<int> &s, int l, int r);
protected:
void run() override;
private:
QVector<int> m_list;
signals:
void sendArray(QVector<int> array);
};
#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
#include <QElapsedTimer>
#include <QDebug>
#include <QString>
MyThread::MyThread(QObject *parent):QThread(parent)
{
}
void MyThread::run()
{
qDebug()<<QString::fromLocal8Bit("当前线程地址为:")<<QThread::currentThread();//指向当前线程地址
QElapsedTimer timeLog;
timeLog.start();
QVector<int > list;
for(int i = 0; i < m_num; i++)
{
list.push_back(rand()%100000);
}
int time = timeLog.elapsed();
qDebug()<<QString::fromLocal8Bit("生成")<<m_num<<QString::fromLocal8Bit("个随机数用时 ")<<time<<QString::fromLocal8Bit(" 毫秒");
emit sendArray(list);
}
void MyThread::recvNum(int num)
{
m_num = num;
}
BubbleSort::BubbleSort(QObject *parent):QThread(parent)
{
}
void BubbleSort::finish(QVector<int> list)
{
for(int i = 0; i < list.size(); i++)
{
m_list.push_back(list.at(i));
}
if(m_list.size()<100)
{
qDebug()<<QString::fromLocal8Bit("finishl没有数据");
}
}
void BubbleSort::run()
{
//sleep(2);
qDebug()<<QString::fromLocal8Bit("冒泡线程地址为:")<<QThread::currentThread();
QElapsedTimer timeLog;
timeLog.start();
if(m_list.size() == 0)
{
qDebug()<<QString::fromLocal8Bit("冒泡 数据为零");
}
buluSort(m_list);
int time = timeLog.elapsed();
qDebug()<<QString::fromLocal8Bit("冒泡排序用时: ")<<time<<QString::fromLocal8Bit(" 毫秒");
emit sendArray(m_list);
}
void BubbleSort::buluSort(QVector<int> &s)
{
qDebug()<<QString::fromLocal8Bit("冒泡排序中");
int swp = 0;
for(int i=0; i<s.size(); i++)
{
for(int j = 0; j < s.size() - i - 1; j++)
{
if(s[j]>s[j+1])
{
swp = s[j];
s[j] = s[j+1];
s[j+1] = swp;
}
}
}
}
QuickSort::QuickSort(QObject *parent):QThread(parent)
{
}
void QuickSort::finish(QVector<int> list)
{
qDebug()<<QString::fromLocal8Bit("快速 finishl来了");
for(int i = 0; i < list.size(); i++)
{
m_list.push_back(list.at(i));
}
}
void QuickSort::run()
{
sleep(1);
qDebug()<<QString::fromLocal8Bit("快速排序线程地址为:")<<QThread::currentThread();
QElapsedTimer timeLog;
timeLog.start();
if(m_list.size() == 0)
{
qDebug()<<QString::fromLocal8Bit("快速 数据为零");
}
quickSorts(m_list,0,m_list.size());
int time = timeLog.elapsed();
qDebug()<<QString::fromLocal8Bit("快速排序用时: ")<<time<<QString::fromLocal8Bit(" 毫秒");
emit sendArray(m_list);
}
void QuickSort::quickSorts(QVector<int> &data, int low, int high)
{
qDebug()<<QString::fromLocal8Bit("xuanze排序中");
int min = 0;
for(int i=0;i<data.size();i++)
{
min = i;
for(int j=i+1;j<data.size();j++)
{
if(data[min]>data[j])
{
min = j;
}
}
int temp = data[min];
data[min] = data[i];
data[i] = temp;
}
}
void QuickSort::Swap(int &a, int &b)
{
int swp = a;
a = b;
b = swp;
}