多线程简易实例

前言

(通过反复创建二进制文件根据创建时间推测电脑性能)

本文创建了一个具备基础多线程的一个小实例,主要是靠对一个二进制文件的读取后存入数组,然后重复创建二进制文件并把数组塞入,根据创建相同的文件数所耗费的时间来判断性能。


提示:以下是本篇文章正文内容,下面案例可供参考

一、主线程头文件

#ifndef CREADANDWRITE_H
#define CREADANDWRITE_H
#include<QTime>
#include<QFile>
#include<QDataStream>
#include<QDebug>
#include<QVector>
#include<QThread>
#include <QWidget>
#include<mythread.h>
#include<mythread1.h>
#include<mythread2.h>
#include<mythread3.h>
#include<mythread4.h>
#include<QFileDialog>

namespace Ui {
class CReadAndWrite;
}

class CReadAndWrite : public QWidget
{
    Q_OBJECT

signals:
    void MyThreadForVector(QVector<qint16> q,QVector<qint8> w,QVector<qint32> e,QString);
    void MyThreadForVector1(QVector<qint16> r,QVector<qint8> t,QVector<qint32> y,QString);
    void MyThreadForVector2(QVector<qint16> u,QVector<qint8> i,QVector<qint32> o,QString);
    void MyThreadForVector3(QVector<qint16> u,QVector<qint8> i,QVector<qint32> o,QString);
    void MyThreadForVector4(QVector<qint16> u,QVector<qint8> i,QVector<qint32> o,QString);

public:
    explicit CReadAndWrite(QWidget *parent = 0);
    ~CReadAndWrite();
    void createView();
    QVector<qint16> twoNum;
    QVector<qint8> oneNum;
    QVector<qint32> fourNum;
    QString path1;
    MyThread *thread1;
    MyThread1 *thread2;
    MyThread2 *thread3;
    MyThread3 *thread4;
    MyThread4 *thread5;

private:
    Ui::CReadAndWrite *ui;
    QThread *firstThread;
    QThread *secondThread;
    QThread *thirdThread;
    QThread *fourThread;
    QThread *fiveThread;

private slots:
    void on_readBtn_clicked();
};

#endif // CREADANDWRITE_H

二、主线程CPP文件

#include "creadandwrite.h"
#include "ui_creadandwrite.h"

CReadAndWrite::CReadAndWrite(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CReadAndWrite)
{
    ui->setupUi(this);
    createView();
}

void CReadAndWrite::createView()
{
    firstThread = new QThread;//线程容器
    secondThread = new QThread;//线程容器
    thirdThread = new QThread;//线程容器
    fourThread = new QThread;//线程容器
    fiveThread = new QThread;//线程容器

    thread1 = new MyThread();//创建自定义线程
    thread2 = new MyThread1();//创建自定义线程
    thread3 = new MyThread2();//创建自定义线程
    thread4 = new MyThread3();//创建自定义线程
    thread5 = new MyThread4();//创建自定义线程

    thread1->moveToThread(firstThread); //将创建的对象移到线程容器中
    thread2->moveToThread(secondThread); //将创建的对象移到线程容器中
    thread3->moveToThread(thirdThread); //将创建的对象移到线程容器中
    thread4->moveToThread(fourThread); //将创建的对象移到线程容器中
    thread5->moveToThread(fiveThread); //将创建的对象移到线程容器中

    QObject::connect(this,SIGNAL(MyThreadForVector(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)),thread1,SLOT(getaddress(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)));
    QObject::connect(this,SIGNAL(MyThreadForVector1(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)),thread2,SLOT(getaddress(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)));
    QObject::connect(this,SIGNAL(MyThreadForVector2(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)),thread3,SLOT(getaddress(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)));
    QObject::connect(this,SIGNAL(MyThreadForVector3(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)),thread4,SLOT(getaddress(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)));
    QObject::connect(this,SIGNAL(MyThreadForVector4(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)),thread5,SLOT(getaddress(QVector<qint16>,QVector<qint8>,QVector<qint32>,QString)));

    firstThread->start();
    secondThread->start();
    thirdThread->start();
    fourThread->start();
    fiveThread->start();

    QFile file = QFileDialog::getOpenFileName(this,"choose src Directory","C:/.dat");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
    QDataStream stream1(&file);
    qint16 a;
    qint8 b;
    qint32 c;

    for(int i=0;i<2208*2000;i++)
    {
        stream1>>a;
        twoNum.append(a);
    }

    for(int i=0;i<2208*2000;i++)
    {
        stream1>>b;
        oneNum.append(b);
    }

    for(int i=0;i<2000;i++)
    {
        stream1>>c;
        fourNum.append(c);
    }
}

void CReadAndWrite::on_readBtn_clicked()
{
    path1 = QFileDialog::getExistingDirectory(this,"","");
    QString a = ui->mathlineEdit->text();
    int b = a.toInt();
    QTime time;
    time.start();
    for(int x=0;x<b;x++)
    {
        if(x%6 == 0)
        {
            QFile file2;
            QString fileName = path1+"/" + QString::number(x) + "test.dat";
            file2.setFileName(fileName);
            if (!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
                return;
            QDataStream stream(&file2);
            stream.setByteOrder(QDataStream::LittleEndian);
            stream<<twoNum;
            stream<<oneNum;
            stream<<fourNum;
            file2.close();
        }
        else if(x%6 == 1)
        {
            emit MyThreadForVector(twoNum,oneNum,fourNum,path1);
        }
        else if(x%6 == 2)
        {
            emit MyThreadForVector1(twoNum,oneNum,fourNum,path1);
        }
        else if(x%6 == 3)
        {
            emit MyThreadForVector2(twoNum,oneNum,fourNum,path1);
        }
        else if(x%6 == 4)
        {
            emit MyThreadForVector3(twoNum,oneNum,fourNum,path1);
        }
        else if(x%6 == 5)
        {
            emit MyThreadForVector4(twoNum,oneNum,fourNum,path1);
        }
    }
    qDebug()<<time.elapsed()/1000.0<<"s";
    ui->lineEdit->setText(QString::number(time.elapsed()/1000.0));
}

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

三、分线程1头文件

代码如下(示例):

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

class MyThread:public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    int i;

private:
    volatile bool isStop;
    QVector<qint16> Num1;
    QVector<qint8> Num2;
    QVector<qint32> Num3;
    QString path;

public slots:
    void getaddress(QVector<qint16> q,QVector<qint8> w,QVector<qint32> e,QString);
};

#endif // MYTHREAD_H

四、分线程1CPP文件

代码如下(示例):

#include "mythread.h"
#include<QTime>
#include<QDataStream>
#include<QDebug>
#include<QFile>

MyThread::MyThread(QObject *parent)
{
    i = 1;
}

void MyThread::getaddress(QVector<qint16> a, QVector<qint8> b, QVector<qint32> c,QString d)
{
    Num1 = a;
    Num2 = b;
    Num3 = c;
    path = d;
    QFile file2(path + "/" + QString::number(i) + "test.dat");
    i = i + 6;
    if (!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QDataStream stream(&file2);
    stream.setByteOrder(QDataStream::LittleEndian);
    stream<<Num1;
    stream<<Num2;
    stream<<Num3;
    file2.close();
}

五、分线程2头文件

代码如下(示例):

#ifndef MYTHREAD1_H
#define MYTHREAD1_H
#include<QVector>
#include<QThread>

class MyThread1:public QObject
{
    Q_OBJECT
public:
    explicit MyThread1(QObject *parent = 0);
    int i;

private:
    volatile bool isStop;
    QVector<qint16> Num1;
    QVector<qint8> Num2;
    QVector<qint32> Num3;
    QString path;

public slots:
    void getaddress(QVector<qint16> q,QVector<qint8> w,QVector<qint32> e,QString);
};

#endif // MYTHREAD1_H

六、分线程2CPP文件

代码如下(示例):

#include "mythread1.h"
#include<QTime>
#include<QDataStream>
#include<QDebug>
#include<QFile>

MyThread1::MyThread1(QObject *parent)
{
    i = 2;
}

void MyThread1::getaddress(QVector<qint16> a, QVector<qint8> b, QVector<qint32> c,QString d)
{
    Num1 = a;
    Num2 = b;
    Num3 = c;
    path = d;
    QFile file2(path + "/" + QString::number(i) + "test.dat");
    i = i + 6;
    if (!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QDataStream stream(&file2);
    stream.setByteOrder(QDataStream::LittleEndian);
    stream<<Num1;
    stream<<Num2;
    stream<<Num3;
    file2.close();
}

七、分线程3头文件

代码如下(示例):

#ifndef MYTHREAD2_H
#define MYTHREAD2_H
#include<QVector>
#include<QThread>

class MyThread2:public QObject
{
    Q_OBJECT
public:
    explicit MyThread2(QObject *parent = 0);
    int i;

private:
    volatile bool isStop;
    QVector<qint16> Num1;
    QVector<qint8> Num2;
    QVector<qint32> Num3;
    QString path;

public slots:
    void getaddress(QVector<qint16> q,QVector<qint8> w,QVector<qint32> e,QString);
};

#endif // MYTHREAD2_H

八、分线程3CPP文件

代码如下(示例):

#include "mythread2.h"
#include<QTime>
#include<QDataStream>
#include<QDebug>
#include<QFile>

MyThread2::MyThread2(QObject *parent)
{
    i = 3;
}

void MyThread2::getaddress(QVector<qint16> a, QVector<qint8> b, QVector<qint32> c,QString d)
{
    Num1 = a;
    Num2 = b;
    Num3 = c;
    path = d;
    QFile file2(path + "/" + QString::number(i) + "test.dat");
    i = i + 6;
    if (!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QDataStream stream(&file2);
    stream.setByteOrder(QDataStream::LittleEndian);
    stream<<Num1;
    stream<<Num2;
    stream<<Num3;
    file2.close();
}

九、分线程4头文件

代码如下(示例):

#ifndef MYTHREAD3_H
#define MYTHREAD3_H
#include<QVector>
#include<QThread>

class MyThread3:public QObject
{
    Q_OBJECT
public:
    explicit MyThread3(QObject *parent = 0);
    int i;

private:
    volatile bool isStop;
    QVector<qint16> Num1;
    QVector<qint8> Num2;
    QVector<qint32> Num3;
    QString path;

public slots:
    void getaddress(QVector<qint16> q,QVector<qint8> w,QVector<qint32> e,QString);
};

#endif // MYTHREAD3_H

十、分线程4CPP文件

代码如下(示例):

#include "mythread3.h"
#include<QTime>
#include<QDataStream>
#include<QDebug>
#include<QFile>

MyThread3::MyThread3(QObject *parent)
{
    i = 4;
}

void MyThread3::getaddress(QVector<qint16> a, QVector<qint8> b, QVector<qint32> c,QString d)
{
    Num1 = a;
    Num2 = b;
    Num3 = c;
    path = d;
    QFile file2(path + "/" + QString::number(i) + "test.dat");
    i = i + 6;
    if (!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QDataStream stream(&file2);
    stream.setByteOrder(QDataStream::LittleEndian);
    stream<<Num1;
    stream<<Num2;
    stream<<Num3;
    file2.close();
}

十一、分线程5头文件

代码如下(示例):

#ifndef MYTHREAD4_H
#define MYTHREAD4_H
#include<QVector>
#include<QThread>

class MyThread4:public QObject
{
    Q_OBJECT
public:
    explicit MyThread4(QObject *parent = 0);
    int i;

private:
    volatile bool isStop;
    QVector<qint16> Num1;
    QVector<qint8> Num2;
    QVector<qint32> Num3;
    QString path;

public slots:
    void getaddress(QVector<qint16> q,QVector<qint8> w,QVector<qint32> e,QString);
};

#endif // MYTHREAD4_H

十二、分线程5CPP文件

代码如下(示例):

#include "mythread4.h"
#include<QTime>
#include<QDataStream>
#include<QDebug>
#include<QFile>

MyThread4::MyThread4(QObject *parent)
{
    i = 5;
}

void MyThread4::getaddress(QVector<qint16> a, QVector<qint8> b, QVector<qint32> c,QString d)
{
    Num1 = a;
    Num2 = b;
    Num3 = c;
    path = d;
    QFile file2(path + "/" + QString::number(i) + "test.dat");
    i = i + 6;
    if (!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QDataStream stream(&file2);
    stream.setByteOrder(QDataStream::LittleEndian);
    stream<<Num1;
    stream<<Num2;
    stream<<Num3;
    file2.close();
}

十三、main.cpp

代码如下(示例):

#include "creadandwrite.h"
#include <QApplication>
#include <QMetaType>
#include<QVector>

int main(int argc, char *argv[])
{

//    Q_DECLARE_METATYPE(QVector<qint16>);
    qRegisterMetaType<QVector<qint16>>("QVector<qint16>");

    qRegisterMetaType<QVector<qint8>>("QVector<qint8>");

    qRegisterMetaType<QVector<qint32>>("QVector<qint32>");
    QApplication a(argc, argv);
    CReadAndWrite w;
    w.show();

    return a.exec();

}

UI界面图

在这里插入图片描述

总结

以上就是代码的全部,其实只需要看主线程和第一个分线程就够了,后面都是重复的代码,多开线程就是为了提高处理的速度,中间涉及到的知识点不多,也都很好理解,看懂信号,连接,多线程也就会了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值