一、在文件中添加c++线程文件
1、添加c++文件继承于QObject
2、通过信号与槽的机制在主函数中启动子线程
3、再通过信号与槽的机制将子函数中的数据传入主函数
实现思路:在线程中定义一个接收主函数传入要生成随机数个数的函数,通过主函数的信号与槽机制接收到,在线程中的run()函数中实现随机数的实现,在run函数结尾发送传回到主线程数组的信号,在主函数中启用
二、线程头文件、cpp
头文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include<QVector>
class suijishu : public QThread
{
Q_OBJECT
public:
explicit suijishu(QObject *parent = nullptr);
void run();
int m_num;
void setm_num(int num);
signals:
void wancheng(QVector<int>);
};
class maopao : public QThread
{
Q_OBJECT
public:
explicit maopao(QObject *parent = nullptr);
QVector<int>m_list;
void setm_list(QVector<int>list);
void run();
signals:
void paixu(QVector<int>);
};
#endif // MYTHREAD_H
线程cpp
#include "mythread.h"
#include<QDebug>
#include<QElapsedTimer>
#include<QRandomGenerator>
suijishu::suijishu(QObject *parent)
: QThread{parent}
{
}
void suijishu::run()
{
//查看进程地址
qDebug()<<"随机数线程地址:"<<suijishu::currentThread();
//记录进程时间
QElapsedTimer time;
time.start();
QVector<int>list;
for(int i=0;i<m_num;i++)
{
QRandomGenerator generator;
//设置种子
generator.seed(QRandomGenerator::global()->generate());
list.push_back(generator.generate()%10000);
}
qDebug()<<"随机数运行时间"<<time.elapsed()<<"毫秒";
emit wancheng(list);
}
void suijishu::setm_num(int num)
{
m_num = num;
}
maopao::maopao(QObject *parent)
: QThread{parent}
{
}
void maopao::setm_list(QVector<int> list)
{
m_list = list;
}
void maopao::run()
{
qDebug()<<"冒泡排序地址"<<maopao::currentThread();
QElapsedTimer time;
time.start();
for(int i=0;i<m_list.size()-1;i++)
{
for(int j=0;j<m_list.size()-1-i;j++)
{
if(m_list[j]>m_list[j+1])
{
int temp = m_list[j];
m_list[j]=m_list[j+1];
m_list[j+1]=temp;
}
}
}
qDebug()<<"冒泡排序运行时间"<<time.elapsed()<<"毫秒";
emit paixu(m_list);
}
三、主函数头文件
#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);
~Widget();
signals:
void setnum(int );
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
suijishu *thread;
maopao *m;
};
#endif // WIDGET_H
cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
thread = new suijishu;
m = new maopao;
//给子线程传参
connect(this,&Widget::setnum,thread,&suijishu::setm_num);
//给排序的线程传要排序的输组
connect(thread,&suijishu::wancheng,m,&maopao::setm_list);
//把子线程的数组传入
connect(thread,&suijishu::wancheng,this,[=](QVector<int>list){
//启动冒泡排序的线程
m->start();
for(int i=0;i<list.size();i++)
{
ui->listWidget->addItem(QString::number(list.at(i)));
}
});
connect(m,&maopao::paixu,this,[=](QVector<int>m_list){
for(int i=0;i<m_list.size();i++)
{
ui->listWidget_2->addItem(QString::number(m_list.at(i)));
}
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//将num传给子线程
emit setnum(10000);
//启动子线程
thread->start();
}