本文是在观看了爱编程的大丙关于多线程的讲解后做的一篇笔记。
之后对Qt的多线程有了很系统的认知,真的特别感谢爱编程的大丙!!!
目录
需求:
实现自动生成10000个数字,并将其进行冒泡和快速排序,排序的结果显示在应用程序界面上。并打印生成数字,冒泡和快速排序的线程ID和执行时间。
一、Qt多线程传统方法::重写run()方法
Qt拥有QThread类,当需要使用多线程的时候,可以继承QThread类,然后重写run()方法。
所有的线程都是通过实例化对象来进行操作。
所有在线程中实现的代码,都将在run()函数中进行处理。
该需求的实现很明显分为三个步骤
①生成数字 ②冒泡排序 ③快速排序
那么每一个功能的实现都可以放在线程中进行,所以,三个步骤+一个主线程,这个程序可以分为4个线程来实现。读者也可以将三个步骤放在主线程中去实现,但是可能会发生程序无响应的问题,难以在功能执行完毕之前对窗口进行操作。
1.继承QThread,重写run()方法
Generate.h
#ifndef QGENERATE_H
#define QGENERATE_H
#include <QObject>
#include <QThread>
#include <vector>
#include <QElapsedTimer>
class Generate:public QThread
{
Q_OBJECT
public:
Generate();
protected:
void run() override;
signals:
void send_Array(vector<int> list); //将生成的随机数发送给主线程,并在主线程显示出来
void send_str(QString str);
private:
int m_num;
vector<int> m_num_list;
public:
void recvNum(int num);
};
#endif // QGENERATE_H
该类用于实现生成随机数,继承了QThread类。前文提到,所有在线程中实现的代码,都将在run()函数中进行处理。所以在Generate.cpp中对run()函数进行重写。
Generate.cpp
#include "generate.h"
Generate::Generate()
{
}
void Generate::run()
{
qDebug()<<"生成随机数的线程:"<<QThread::currentThread();
QElapsedTimer time;
time.start(); //开始
for(int i =0 ;i <m_num ;i++)
{
m_num_list.push_back(qrand()%100000);
}
qint64 milsec = time.elapsed();
qDebug()<<