Qt 多线程创造随机数、冒泡排序

一、在文件中添加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();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值