当前位置: 首页>数据库>正文

Qt 多线程操作sqlite qt多线程例子


文章目录

  • Qt 多线程案例:方式一
  • 多线程使用:方式一
  • 案例分享


Qt 多线程案例:方式一

多线程使用:方式一

1.创建一个线程类的子对象,继承QThread

class MyThrad:public QThread
{
	......
}

2.重写父类的run()方法(虚函数),在该函数内部编写子线程要处理的具体业务流程

class MyThread:public QThread
{
	protected:
	void run()
	{
		.........;
	}
}

3.在主线程中创建子线程对象,new一个

MyThread * subThread = new MyThrad;

4.启动子线程,调用start()方法

subThread->start();

5.释放线程资源,使用信号槽机制,窗口关闭时释放

connect(this,&QWidget::destroyed,this,[=](){
  //t1 为创建的子线程对象
  gen->quit();
  gen->wait();
  gen->deleteLater();
});

案例分享

案例描述:创建3个子线程,分别用于生成 随机数、随机数冒泡排序、随机数快速排序。

Qt 多线程操作sqlite qt多线程例子,Qt 多线程操作sqlite qt多线程例子_子线程,第1张

1.按默认方式创建一个 空Qt项目

2.对窗口进行布局,并更改 objectName

Qt 多线程操作sqlite qt多线程例子,Qt 多线程操作sqlite qt多线程例子_快速排序_02,第2张

  • 对随机数控件(List Widget) 更改objectName :randList
  • 对冒泡排序控件(List Widget) 更改objectName :bubbleList
  • 对快速排序控件(List Widget) 更改objectName :quickList
  • 对按钮控件(PushButton) 更改objectName :start

3.创建子线程类

添加C++类 ,先继承 QOject类 ,随后更改为QThread

Qt 多线程操作sqlite qt多线程例子,Qt 多线程操作sqlite qt多线程例子_Qt 多线程操作sqlite_03,第3张

//创建子线程头文件

Genrate:生成随机数线程类

通过信号槽机制:接受主线程传入随机数上线(int num),生成随机数组传入主线程窗口 、排序窗口

BubbleSort :冒泡排序线程类

接受随机线程无序数组,进行排序,将排序后数组传入主窗口线程显示

QuickSort: 快速排序线程类

接受随机线程无序数组,进行排序,将排序后数组传入主窗口线程显示

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include<QVector>//动态数组

class Generate : public QThread
{
    Q_OBJECT
public:
    explicit Generate(QObject *parent = 0);

    //用于接受主线程传递过来的num(随机数上线数)
    void recvNum(int num);

signals:
    //发送给主线程的随机数
    void sendArray(QVector<int>num);

protected:
    void run();
public slots:

private:
    int m_num;
};



//冒泡排序
class BubbleSort : public QThread
{
    Q_OBJECT
public:
    explicit BubbleSort(QObject *parent = 0);

    //用于接受随机数线程的  随机数
    void recvArray(QVector<int>list);

signals:
    //发送给主线程的 有序数列
    void finish(QVector<int>num);

protected:
    void run();
public slots:

private:
   QVector<int> m_list;
};


//快速排序
class QuickSort : public QThread
{
    Q_OBJECT
public:
    explicit QuickSort(QObject *parent = 0);

    //用于接受随机数线程的  随机数
    void recvArray(QVector<int>list);

signals:
    //发送给主线程的 有序数列
    void finish(QVector<int>num);

protected:
    void run();

    void quickSort( QVector<int>& s,int l,int r);//快排算法

public slots:

private:
    QVector<int> m_list;
};

#endif // MYTHREAD_H

//子线程源文件

#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::currentThread();

    QVector <int> list;
    QElapsedTimer time;
    time.start();

    //创建 m_num 个
    for (int i=0;i<m_num;++i)
    {
        list.push_back(qrand()%10000);
    }
    int milsec = time.elapsed();

    qDebug()<<"设置随机数个数:"<<m_num<<"  运行时间:"<<QString::number(milsec)<<"毫秒";
    //发送信号
    emit sendArray(list);

}

//冒泡排序构造函数 继承QThread(parent)
BubbleSort::BubbleSort(QObject *parent): QThread(parent)
{

}

//冒泡排序 接收 生成线程 随机数
void BubbleSort::recvArray(QVector<int> list)
{
    m_list = list;
}

//冒泡排序 运行函数
void BubbleSort::run()
{
    qDebug()<<"冒泡线程地址:"<<QThread::currentThread();

    QElapsedTimer time;
    time.start();
    //冒泡排序
    int temp;
       for(int i=0; i<m_list.size(); ++i)
       {
           for(int j=0; j<m_list.size()-i-1; ++j)
           {
               if(m_list[j] > m_list[j+1])
               {
                   temp = m_list[j];
                   m_list[j] = m_list[j+1];
                   m_list[j+1] = temp;
               }
           }
       }
    int milsec = time.elapsed();
    qDebug()<<"冒泡线程运算时间:"<<QString::number(milsec)<<"毫秒";
    emit finish(m_list);

}




//快速排序构造函数
QuickSort::QuickSort(QObject *parent):QThread(parent)
{

}

//快速排序 接受随机数组
void QuickSort::recvArray(QVector<int> list)
{
    m_list=list;
}

//快速排序 线程运行函数
void QuickSort::run()
{
    qDebug()<<"快速排序线程地址:"<<QThread::currentThread();

    QElapsedTimer time;
    time.start();

    //快排
    quickSort(m_list,0,m_list.size()-1);
    int s = time.elapsed();
    qDebug()<<"快速排序线程时间:"<<QString::number(s);
    emit finish(m_list);
}

void QuickSort::quickSort(QVector<int> &s, int l, int r)
{
    if (l < r)
    {
        int i = l, j = r;
        // 拿出第一个元素, 保存到x中,第一个位置成为一个坑
        int x = s[l];
        while (i < j)
        {
            // 从右向左找小于x的数
            while (i < j && s[j] >= x)
            {
                //左移, 直到遇到小于等于x的数
                j--;
            }
            if (i < j)
            {
                //将右侧找到的小于x的元素放入左侧坑中, 右侧出现一个坑
                //左侧元素索引后移
                s[i++] = s[j];
            }

            // 从左向右找大于等于x的数
            while (i < j && s[i] < x)
            {
                //右移, 直到遇到大于x的数
                i++;
            }
            if (i < j)
            {
                //将左侧找到的元素放入右侧坑中, 左侧出现一个坑
                //右侧元素索引向前移动
                s[j--] = s[i];
            }
        }
        //此时 i=j,将保存在x中的数填入坑中
        s[i] = x;
        quickSort(s, l, i - 1); // 递归调用
        quickSort(s, i + 1, r);
    }
}

//主线程(qt窗口线程)

#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //1.创建子线程对象
    Generate *genrate = new Generate;
    BubbleSort *bubble = new BubbleSort;
    QuickSort * quick = new QuickSort;

    connect(this,&Widget::starting,genrate,&Generate::recvNum);

    //2.启动子线程
    connect(ui->start,&QPushButton::clicked,this,[=](){
      //类外启动子线程,使用线程对象调用start()方法
     emit  starting(10000);
     genrate->start();

    });

    connect(genrate,&Generate::sendArray,bubble,&BubbleSort::recvArray);
    connect(genrate,&Generate::sendArray,quick,&QuickSort::recvArray);
    //接受子线程数据
    connect(genrate,&Generate::sendArray,this,[=](QVector<int>list){
        for (int i =0;i<list.size();++i)
        {
            ui->randList->addItem(QString::number(list[i]));
        }

        bubble->start();
        quick->start();
    });

    connect(bubble,&BubbleSort::finish,this,[=](QVector<int>list){
        for (int i=0;i<list.size();++i)
        {
            ui->bubbleList->addItem(QString::number(list[i]));
        }
    });

    connect(quick,&QuickSort::finish,this,[=](QVector<int>list){
        for (int i=0;i<list.size();++i)
        {
            ui->quickList->addItem(QString::number(list[i]));
        }
    });

}

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

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

connect(quick,&QuickSort::finish,this,[=](QVector<int>list){
    for (int i=0;i<list.size();++i)
    {
        ui->quickList->addItem(QString::number(list[i]));
    }
});

}

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



https://www.xamrdz.com/database/6vk1935705.html

相关文章: