Qt200_QThread使用方法1:直接继承一个QThread类

步骤:

  1. 新建一个线程类,让其继承于QThread
  2. 重写QThread类中的 run 函数(private : void run(){生成随机数})
  3. 子线程 写一个槽函数 接收主线程 传过来的控制数据
  4. 子线程的事情做完之后,将处理好的数据发送给主线程

注意:

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值