qt-多线程读文件

本文介绍如何在QT中使用多线程读取文件,详细讲解线程创建、线程优先级设置以及如何通过信号槽实现线程与界面的通讯。在实际操作中遇到文件读取超界的问题,最终通过创建两个独立线程并调整文件打开模式来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

qt本身提供了许多多线程的类,方便我们进行多线程的开发

创建线程:

线程类

Qt 包含下面一些线程相关的类:
QThread 提供了开始一个新线程的方法
QThreadStorage 提供逐线程数据存储
QMutex 提供相互排斥的锁,或互斥量
QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁
QReadWriterLock 提供了一个可以同时读操作的锁
QReadLocker与QWriteLocker 是便利类,它自动对QReadWriteLock加锁与解锁
QSemaphore 提供了一个整型信号量,是互斥量的泛化
QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

使用qt的多线程进行文件读写,我们只需要实现比较简单的方式。

首先是实现一个线程类,

class threadreadfile :public QThread
{
    Q_OBJECT
public:

signals:
    void showfileText(double );

protected:
    void run();
public:
    QString filepath;
    QString filedata;
    double filesize;
    double fileNum;
};

类只需要集成QThread然后实现run函数之后就可以调用
start函数开始多线程了,

    thread.start(QThread::LowPriority);
    thread.wait();

start函数里面的参数是定义这个线程的优先级,也方便在run函数里面识别线程。
这样就实现了一个线程的启动,
然后在run函数里面实现需要的细节。

界面与线程之间通讯

线程类是没有调用ui界面的接口的,
我们有时候在线程里面进行了操作需要改变界面的显示,比如progressbar就是已

Qt Creator 多线程读取文件到程序显示 利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MyObj; class MyObj : public QObject { Q_OBJECT public: MyObj(); //新的线程 signals: void toLine(QString line); private slots: void doWork(); }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void appendText(QString); //定义一个槽 private: Ui::MainWindow *ui; QThread *t; MyObj *obj; }; #endif // MAINWINDOW_H 而MAIN主文件的内容为了防止中文乱码做了如下修改: #include "mainwindow.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //设置中文字体 防止乱码 a.setFont(QFont("Microsoft Yahei", 9)); //设置中文编码 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("GBK"); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); #endif MainWindow w; w.show(); return a.exec(); } 接下来重点来了,源文件CPP里为 #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); t = new QThread(); //QThread obj = new MyObj(); obj->moveToThread(t); qDebug()<<"main thread:"<<QThread::currentThread(); connect(t,SIGNAL(started()), obj, SLOT(doWork())); connect(obj,SIGNAL
Qt 中实现多线程读取文件内容,通常会结合 `QThread` 或 `QtConcurrent` 模块来完成。这种方式可以避免在主线程中进行耗时的文件读取操作,从而防止界面冻结,提高用户体验。 ### 使用 QThread 实现多线程文件读取 `QThread` 是 Qt 提供的一个低级线程管理类,适合用于需要精细控制线程生命周期和任务执行的场景。以下是一个基于 `QFile` 和 `QThread` 的多线程文件读取示例: ```cpp #include <QFile> #include <QTextStream> #include <QThread> #include <QDebug> class FileReader : public QObject { Q_OBJECT public: FileReader(const QString &filePath, QObject *parent = nullptr) : QObject(parent), filePath(filePath) {} public slots: void readFile() { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "无法打开文件:" << filePath; emit finished(); return; } QTextStream in(&file); QString content = in.readAll(); // 一次性读取全部内容 file.close(); emit fileRead(content); // 发送读取到的内容 } signals: void fileRead(const QString &content); // 信号用于传递文件内容 void finished(); // 读取完成信号 }; // 在主线程中创建线程并启动 void startFileRead(const QString &filePath) { QThread *thread = new QThread; FileReader *reader = new FileReader(filePath); reader->moveToThread(thread); QObject::connect(thread, &QThread::started, reader, &FileReader::readFile); QObject::connect(reader, &FileReader::fileRead, [](const QString &content) { qDebug() << "文件内容:" << content.left(100); // 打印前100个字符 }); QObject::connect(reader, &FileReader::finished, thread, &QThread::quit); QObject::connect(reader, &FileReader::finished, reader, &QObject::deleteLater); QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater); thread->start(); } ``` ### 使用 QtConcurrent 实现多线程文件读取 如果你希望使用更简洁的 API,可以使用 `QtConcurrent::run()` 来异步执行文件读取任务,这种方式适合执行一次性任务,无需手动管理线程对象。 ```cpp #include <QtConcurrent/QtConcurrentRun> #include <QFile> #include <QTextStream> #include <QDebug> QString readFileContent(const QString &filePath) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "无法打开文件:" << filePath; return QString(); } QTextStream in(&file); QString content = in.readAll(); // 一次性读取全部内容 file.close(); return content; } // 启动异步读取 void startAsyncFileRead(const QString &filePath) { QFuture<QString> future = QtConcurrent::run(readFileContent, filePath); QFutureWatcher<QString> *watcher = new QFutureWatcher<QString>(); watcher->setFuture(future); QObject::connect(watcher, &QFutureWatcher<QString>::finished, [watcher, filePath]() { QString content = watcher->future().result(); qDebug() << "文件内容:" << content.left(100); // 打印前100个字符 watcher->deleteLater(); }); } ``` ### 多线程读取文件的注意事项 - **文件锁定与并发访问**:如果多个线程同时读取同一个文件,通常不会出现冲突,但如果多个线程尝试写入同一个文件,则需要使用 `QMutex` 或其他同步机制来保护共享资源。 - **内存管理**:在多线程环境中,确保正确释放动态分配的对象,如使用 `QObject::deleteLater()` 来安全删除对象。 - **线程优先级**:可以使用 `QThread::setPriority()` 设置线程优先级,以控制线程对 CPU 资源的占用。 以上方法可以有效地实现 Qt 中的多线程文件读取功能,适用于大型文件处理或需要保持界面响应的场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值