Qt中的多线程(二)——多线程生成随机数

先创建ui界面,如下图:

mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void starting(int num);
private:
    Ui::MainWindow *ui;
};

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);

    //1.创建子线程对象
    Generate* gen = new Generate();

    connect(this,&MainWindow::starting,gen,&Generate::recvNum);  //使用信号和槽机制将随机数的个数发送到gen
    //2.启动子线程
    connect(ui->start,&QPushButton::clicked,this,[=]()
    {
        emit starting(10000); //发送随机数的个数
        gen->start();
    });

    //接收子线程发送的数据,接收类型是Generate::sendArray的参数类型QVector<int>
    connect(gen,&Generate::sendArray,this,[=](QVector<int> list)
    {
        for(int i=0;i<list.size();i++)
        {
            ui->randlist->addItem(QString::number(list.at(i)));
        }
    });
}

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

mythread.h

#include <QThread>
#include <QVector>

//创建MyThread类,父类选择QObject,创建后将QObject父类修改为QThread
//生成随机数  按照该类名称将MyTread类名修改为Generate
class Generate : public QThread
{
    Q_OBJECT
public:
    explicit Generate(QObject *parent = nullptr);
    void recvNum(int num);  //槽函数,用作设置随机数的个数m_num

protected:
    void run() override;

signals:
    //生成的随机数要发送到ui线程(主线程)中,就需要信号传出去
    //随机数是QVector<int>类型,所以这个信号的参数也是QVector<int>类型
    void sendArray(QVector<int> num);

public slots:

private:
    int m_num;
};

mythread.cpp

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

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

}

void Generate::recvNum(int num)
{
    m_num=num;
}

void Generate::run()
{
    qDebug()<<"生成随机数的线程的线程地址:"<<QThread::currentThreadId();
    QVector<int> list;
    QElapsedTimer timer;   //用来记录某个流程执行所用的时间,从start()开始计时,elapsed()返回执行所需的时间(ms)
    timer.start();
    for(int i=0;i<m_num;i++)
    {
        list.push_back(qrand()%10000);  //产生10000以内的随机数
    }
    int milsec=timer.elapsed();

    qDebug()<<"生成"<<m_num<<"个随机数总共用时:"<<milsec<<"毫秒";
    emit sendArray(list);  //将list使用信号函数传出去
}
运行之后,显示界面如下:

点击“开始”,界面没有任何反应,查看应用程序输出显示:

 提示connect不支持'QVector<int>'类型,确保使用qRegisterMetaType()进行注册。也就是在MainWindow中connect连接Generate::sendArray信号到MainWindow槽时的传参使用QVector<int>类型没有注册。

qRegisterMetaType()是一个模板函数,需要再main函数QApplication()下面添加指定支持类型的模板函数,譬如需要支持'QVector<int>'类型,添加两处:

  1. 在qRegisterMetaType后紧接加一个<>,里面写QVector<int>类型;
  2. 括号里面写"QVector<int>":
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<QVector<int>>("QVector<int>");
    MainWindow w;
    w.show();
    return a.exec();
}

以上多线程生成随机数就完成了;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值