按顺序读取多个文件 启动子线程后从主线程给的文件名读取内容 qt
时间: 2023-12-04 13:05:54 浏览: 68
QT 实现文件的读取操作
4星 · 用户满意度95%
好的,对于您的问题,我可以给出以下解决方案:
1. 在主线程中创建一个 QStringList 存储要读取的文件名列表。
2. 创建一个 QMutex 互斥锁,保证在读取文件时不会出现冲突。
3. 创建一个子线程,在子线程中实现读取文件的函数,函数需要接收一个文件名参数。
4. 在子线程中使用 while 循环,不断从 QStringList 中获取文件名,直到列表为空。
5. 在子线程中调用读取文件的函数,将获取到的文件名作为参数传入。
6. 在读取文件的函数中,使用 QMutexLocker 保证多个线程不会同时访问同一个文件。
7. 读取完一个文件后,将文件内容发送给主线程。
8. 在主线程中接收子线程发送的文件内容信号,按顺序将文件内容写入到一个文件中。
以下是示例代码:
主线程:
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QFile>
#include <QMutex>
#include <QMutexLocker>
#include <QStringList>
#include <QDebug>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
signals:
void fileContent(const QString &fileName, const QString &content);
public slots:
void readFiles(const QStringList &fileNames)
{
foreach (const QString &fileName, fileNames) {
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream stream(&file);
QString content;
QMutexLocker locker(&m_mutex);
while (!stream.atEnd()) {
content += stream.readLine();
}
emit fileContent(fileName, content);
} else {
qDebug() << "Failed to open file" << fileName;
}
}
}
private:
QMutex m_mutex;
};
class Writer : public QObject
{
Q_OBJECT
public:
explicit Writer(QObject *parent = nullptr) : QObject(parent) {}
signals:
void writeToFile(const QString &fileName, const QString &content);
public slots:
void onFileContent(const QString &fileName, const QString &content)
{
emit writeToFile(fileName, content);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QStringList fileNames;
fileNames << "file1.txt" << "file2.txt" << "file3.txt";
QThread thread;
Worker worker;
Writer writer;
worker.moveToThread(&thread);
writer.moveToThread(&thread);
QObject::connect(&worker, &Worker::fileContent, &writer, &Writer::onFileContent);
QObject::connect(&thread, &QThread::started, [&](){
worker.readFiles(fileNames);
thread.quit();
});
QObject::connect(&writer, &Writer::writeToFile, [&](const QString &fileName, const QString &content){
QFile file("output.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
QTextStream stream(&file);
stream << "File: " << fileName << endl << content << endl;
} else {
qDebug() << "Failed to open file output.txt";
}
});
thread.start();
return a.exec();
}
#include "main.moc"
```
在这里,我们将读取文件的操作放在了子线程中,通过信号槽机制将读取到的文件内容发送给主线程。在主线程中,我们将文件内容按顺序写入到一个文件中。需要注意的是,由于多个线程可能同时访问同一个文件,所以我们使用了 QMutex 进行了线程同步。
阅读全文