Qt多线程:QtConcurrent配合lambda表达式(实例)

时间:2022-03-03 20:48:15

QtConcurrent类可以很简单的实现多线程编程。

实例:

功能:

在子线程中,读当前目录下的main.cpp文件,写入objectFile.cpp文件。

(下面给出QThread方法和QtConcurrent方法)

1、在.pro工程文件中加入

QT += concurrent

CONFIG += c++11

2、源代码

//main.cpp

<span style="font-size:14px;">#include <QCoreApplication>
#include <QThread>
#include <QFile>
#include <QIODevice>
#include "mythread.h"
#include <QByteArray>
#include <QtConcurrent>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"Main: "<< a.thread()->currentThread();

QString sourceFile = "E:/qt/QThread/main.cpp";
QString objectFile = "E:/qt/QThread/objectFile.cpp";

//继承QThread方式
//{
// MyThread thread(sourceFile,objectFile);
// thread.start();
//}

//使用QtConcurrent
QtConcurrent::run([&sourceFile,&objectFile]()
{
QFile mSrc(sourceFile);
QFile mObj(objectFile);
QByteArray data;
if(mSrc.open(QFile::ReadWrite | QFile::Text))
{
data = mSrc.readAll();
if(mObj.open(QFile::WriteOnly | QFile::Text))
{
mObj.write(data);
mObj.close();
mObj.waitForBytesWritten(200);
}
else
{
qDebug()<<mObj.errorString();
}
}
else
{
qDebug()<<mSrc.errorString();
}
}
);


return a.exec();
}
</span>


//mythread.h

<span style="font-size:14px;">#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QFile>
#include <QDebug>
#include <QByteArray>

class MyThread : public QThread
{
public:
MyThread(QString &src,QString &obj);

private:
void run();

private:
QString mSrc;
QString mObj;

QByteArray data;

};

#endif // MYTHREAD_H
</span>


//mythread.cpp

<span style="font-size:14px;">#include "mythread.h"
#include <QString>

MyThread::MyThread(QString &src, QString &obj)
{
mSrc = src;
mObj = obj;
}

void MyThread::run()
{
qDebug()<<"Child: "<<currentThread();

QFile tmpSrc = mSrc;
QFile tmpObj = mObj;

if(tmpSrc.open(QFile::ReadWrite | QFile::Text))
{
data = tmpSrc.readAll();
if(tmpObj.open(QFile::WriteOnly | QFile::Text))
{
tmpObj.write(data);
tmpObj.close();
tmpObj.waitForBytesWritten(200);
}
else
{
qDebug()<<tmpObj.errorString();
}
}
else
{
qDebug()<<tmpSrc.errorString();
}
}
</span>

运行结果:

Qt多线程:QtConcurrent配合lambda表达式(实例)


源码下载: