Qt201_QThread使用方法2:将任务类对象移动到子线程中

步骤:

  1. 创建一个新的类,从QObject派生
  2. 类中添加一个共有的成员函数,子线程要执行的逻辑业务
  3. 在主线程中创建一个QThread对象,这就是子线程的对象
  4. 在主线程中创建工作的类对象(不要指定父对象)
  5. 将mywork对象移动到创建的子线程中去(QObject::moveToThread()方法)
  6. 启动子线程( start() ),这时候线程启动了,但是移动到线程中的对象并没有工作
  7. 调用mywork类对象的工作函数,这时候,是在移动到的那个子线程中运行的

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);
    QThread *thread1;
    QThread *thread2;
    QThread *thread3;
    MyThread *gen;
    BubbleSort *bubble;
    QuickSort *quick;
    ~Widget();

private slots:

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

    //1,创建子线程对象
    thread1 = new QThread;
    thread2 = new QThread;
    thread3 = new QThread;

    //2,创建任务类对象
    gen = new MyThread;
    bubble = new BubbleSort;
    quick = new QuickSort;

    //3,将任务对象移动到子线程中
    gen -> moveToThread(thread1);
    bubble -> moveToThread(thread2);
    quick -> moveToThread(thread3);

    //4,启动子线程
    connect(this,&Widget::starting,gen,&MyThread::working);
    connect(ui->butStart,&QPushButton::clicked,[=]
    {
        emit starting(10000);
        thread1->start();
    });

    //5,将线程1返回的数据,交给线程2,3处理
    connect(gen,&MyThread::sendArray,bubble,&BubbleSort::working);
    connect(gen,&MyThread::sendArray,quick,&QuickSort::working);
    connect(gen,&MyThread::sendArray,[=](QVector<int> list){

        //启动其他两个子线程
        thread2->start();
        thread3->start();

        for(int i=0;i<list.size();i++)
        {
            ui -> randList -> addItem( QString::number( list.at(i) ));
        }
    });

    //将子线程2,3处理好返回的数据,在主线程显示
    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) ));
        }
    });

    //释放资源
    connect(this, &Widget::destroyed,this,[=]{
        qDebug()<<QString::fromLocal8Bit("资源1释放中,,,,,,,,,,,,");
        thread1 ->quit();
        thread1 -> wait();
        thread1 -> deleteLater();
        if(thread1 == nullptr)
            qDebug()<<QString::fromLocal8Bit("资源1释放完毕");
        qDebug()<<QString::fromLocal8Bit("资源2释放中,,,,,,,,,,,,");
        thread2 ->quit();
        thread2 -> wait();
        thread2 -> deleteLater();
        if(thread2 == nullptr)
            qDebug()<<QString::fromLocal8Bit("资源2释放完毕");
        qDebug()<<QString::fromLocal8Bit("资源3释放中,,,,,,,,,,,,");
        thread3 ->quit();
        thread3 -> wait();
        thread3 -> deleteLater();
        if(thread3 == nullptr)
            qDebug()<<QString::fromLocal8Bit("资源3释放完毕");
    });

}

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


子线程:

//mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QVector>
#include <QObject>

class MyThread: public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);

    void working(int num);

private:

signals:

    void sendArray(QVector<int> array);

};


class BubbleSort: public QObject
{
    Q_OBJECT
public:

    explicit BubbleSort(QObject *parent = nullptr);

    void working(QVector<int> array);

private:

    void buluSort(QVector<int> &s);

signals:

    void sendArray(QVector<int> array);

};

class QuickSort: public QObject
{
    Q_OBJECT

public:

    explicit QuickSort(QObject *parent = nullptr);

    void Swap(int &a, int &b);

public slots:

    void working(QVector<int> list);

private:

    void quickSorts(QVector<int> &s, int l, int r);

signals:

    void sendArray(QVector<int> array);

};

#endif // MYTHREAD_H
//mythread.cpp

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

MyThread::MyThread(QObject *parent):QObject(parent)
{

}
void MyThread::working(int num)
{
    qDebug()<<QString::fromLocal8Bit("当前线程地址为:")<<QThread::currentThread();

    QElapsedTimer timeLog;
    timeLog.start();
    QVector<int > list;
    for(int i = 0; i < num; i++)
    {
        list.push_back(rand()%100000);
    }
    int time = timeLog.elapsed();

    qDebug()<<QString::fromLocal8Bit("生成")<<num<<QString::fromLocal8Bit("个随机数用时 ")<<time<<QString::fromLocal8Bit(" 毫秒");
    emit sendArray(list);
}


BubbleSort::BubbleSort(QObject *parent):QObject(parent)
{

}

void BubbleSort::working(QVector<int> array)
{
    //sleep(2);
    qDebug()<<QString::fromLocal8Bit("冒泡线程地址为:")<<QThread::currentThread();
    QElapsedTimer timeLog;
    timeLog.start();
    if(array.size() == 0)
    {
        qDebug()<<QString::fromLocal8Bit("冒泡 数据为零");
    }
    buluSort(array);
    int time = timeLog.elapsed();
    qDebug()<<QString::fromLocal8Bit("冒泡排序用时: ")<<time<<QString::fromLocal8Bit(" 毫秒");
    emit sendArray(array);
}

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):QObject(parent)
{

}

void QuickSort::working(QVector<int> list)
{
    //sleep(1);
    auto str = QString::fromLocal8Bit("选择排序线程地址为:");
    qDebug()<< str << QThread::currentThread();
    QElapsedTimer timeLog;
    timeLog.start();
    if(list.size() == 0)
    {
        qDebug()<<QString::fromLocal8Bit("选择数据为零");
    }
    quickSorts(list,0,list.size());
    int time = timeLog.elapsed();
    qDebug()<<QString::fromLocal8Bit("选择排序用时: ")<<time<<QString::fromLocal8Bit(" 毫秒");
    emit sendArray(list);
}

void QuickSort::quickSorts(QVector<int> &data, int low, int high)
{
    qDebug()<<QString::fromLocal8Bit("选择排序中");
    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;
}

资源回收:

  1. 创建线程对象时,指定父对象。(QThread   t1 = new QThread (this) ;
  2. 在窗口类的析构函数中,释放资源。
  3. 通过Widget::destoryed信号来释放资源(见widget.cpp中 释放资源):
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值