qt-多线程读文件

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

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界面的接口的,
我们有时候在线程里面进行了操作需要改变界面的显

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中使用多线程读取文件数据可以提高程序的效率。以下是一个使用9个线程读取文件数据的示例: 首先,在主线程中定义线程数和文件路径: ```cpp int threadNum = 9; // 线程数 QString filePath = "your_file_path"; // 文件路径 ``` 然后,定义一个继承自QThread的类,用于读取文件数据: ```cpp class FileReader : public QThread { Q_OBJECT public: explicit FileReader(QObject *parent = nullptr) : QThread(parent) {} void run() override { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open file"; return; } QTextStream in(&file); QString line; int lineNum = 0; while (!in.atEnd()) { line = in.readLine(); if (lineNum % threadNum == threadIndex) { // 取该线程负责的数据 // 处理取到的数据 } lineNum++; } } signals: void finished(); private: int threadIndex; // 线程编号 int threadNum; // 线程数 QString filePath; // 文件路径 }; ``` 在该类中,我们重写了run()函数,用于读取文件数据并处理。在run()函数中,我们首先打开文件并使用QTextStream取数据。然后,我们遍历文件中的每一行,并根据线程数和线程编号确定该线程负责取哪些数据。最后,我们将取到的数据进行处理。我们还定义了一个finished()信号,在线程取完成后发出。 接下来,在主线程中创建9个线程并启动它们: ```cpp QList<FileReader*> threadList; for (int i = 0; i < threadNum; i++) { FileReader *thread = new FileReader(); thread->threadIndex = i; thread->threadNum = threadNum; thread->filePath = filePath; connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); threadList.append(thread); thread->start(); } ``` 在这里,我们创建了9个线程,并将线程编号、线程数和文件路径设置为我们之前定义的值。我们还将每个线程的finished()信号连接到该线程的deleteLater()槽函数,确保线程完成后能够正确释放资源。最后,我们启动每个线程。 以上就是在QT中使用9个线程读取文件数据的示例。需要注意的是,在实际使用中,还需要考虑线程间的数据同步和线程池的使用等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值