前言
(通过反复创建二进制文件根据创建时间推测电脑性能)
本文创建了一个具备基础多线程的一个小实例,主要是靠对一个二进制文件的读取后存入数组,然后重复创建二进制文件并把数组塞入,根据创建相同的文件数所耗费的时间来判断性能。
提示:以下是本篇文章正文内容,下面案例可供参考
一、主线程头文件
#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界面图
总结
以上就是代码的全部,其实只需要看主线程和第一个分线程就够了,后面都是重复的代码,多开线程就是为了提高处理的速度,中间涉及到的知识点不多,也都很好理解,看懂信号,连接,多线程也就会了。