Qt多线程处理文本文件并显示
2018-01-10 10:55
288 查看
参考:http://blog.csdn.net/u010650281/article/details/51516776
qt本身提供了许多多线程的类,方便我们进行多线程的开发
创建线程,Qt 包含下面一些线程相关的类:
QThread 提供了开始一个新线程的方法
QThreadStorage 提供逐线程数据存储
QMutex 提供相互排斥的锁,或互斥量
QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁
QReadWriterLock 提供了一个可以同时读操作的锁
QReadLocker与QWriteLocker 是便利类,它自动对QReadWriteLock加锁与解锁
QSemaphore 提供了一个整型信号量,是互斥量的泛化
QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。
使用qt的多线程进行文件读写,我们只需要实现比较简单的方式。首先是实现一个线程类,
类只需要集成QThread然后实现run函数之后就可以调用 ,start函数开始多线程了,
start函数里面的参数是定义这个线程的优先级,也方便在run函数里面识别线程。
这样就实现了一个线程的启动, 然后在run函数里面实现需要的细节。
界面与线程之间通讯
线程类是没有调用ui界面的接口的, 我们有时候在线程里面进行了操作需要改变界面的显示,比如progressbar就是已给典型的控件。通讯方式很简单:
1,在线程类里面定义一个信号量。
2,在界面函数里面添加一个slot函数,
3,在run函数里面出发信号
4,然后在界面函数里面添加一个connect
thread是线程类的实例。
这样就可以进行通讯了,
下面就是基本的代码。
mainwindow.h
mainwindow.cpp
这段代码读取文件没有弄好,就是读取文件的时候,线程一会读的超界。我给定的是10306,但是最后游标(pos)显示的是10412,并不懂为啥read规定了大小只有,还会读的超界。
updata - 6.2
已经解决了上面的问题,就是新建两个类thread,thread2,进行读取,然后把文本的打开方式| QIODevice::Text去掉,因为一般的文件按照这个格式打开会有格式错乱,导致了读取数量不同。
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就是已给典型的控件。通讯方式很简单:
1,在线程类里面定义一个信号量。
signals: void showfileText(double );
2,在界面函数里面添加一个slot函数,
void processbar(double );
3,在run函数里面出发信号
emit showfileText(out.pos());
4,然后在界面函数里面添加一个connect
QObject::connect(&thread,SIGNAL(showfileText(double)),this,SLOT(processbar(double)));
thread是线程类的实例。
这样就可以进行通讯了,
下面就是基本的代码。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDialog>
#include <QFileDialog>
#include <QThread>
namespace Ui {
class MainWindow;
}
class threadreadfile :public QThread
{
Q_OBJECT
public:
signals: void showfileText(double );
protected:
void run();
public:
QString filepath;
QString filedata[3];
double filesize;
double fileNum;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public:
threadreadfile thread,thread2;
public:
void newThread();
private slots:
void on_btnLoadFile_clicked();
void processbar(double );
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDir> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; thread.destroyed(); } void MainWindow::newThread() { QObject::connect(&thread,SIGNAL(showfileText(double)),this,SLOT(processbar(double))); thread.start(QThread::LowPriority); thread2.start(QThread::HighPriority); thread2.wait(); thread.wait(); } void MainWindow::on_btnLoadFile_clicked() { QFileDialog openfile; QString filenamepath = openfile.getOpenFileName(this,tr("get file path"),QDir::currentPath()); ui->lineEditFilePath->setText(filenamepath); thread.filepath = filenamepath; newThread(); if(thread.isFinished()) { ui->textEdit->append(thread.filedata+thread2.filedata); // ui->textEdit->append(); } } void MainWindow::processbar(double index) { qDebug()<<"processbar" <<index; int nowVaule = ui->progressBar->value(); nowVaule = nowVaule + index*100/thread.filesize; ui->progressBar->setValue(nowVaule);// } void threadreadfile::run() { Priority id = QThread::priority(); quint64 num=0; if(id == QThread::LowPriority) { qDebug()<<"this is one"; } if(id == QThread::HighPriority) { num = 1; qDebug()<<"this is two"; } QString filename = filepath; QFile file(filename); if (!file.open(QIODevice::ReadWrite )) //设置打开模式 return; QTextStream out(&file); //设置一个文件流用于输出数据到文本 filesize = file.size(); qDebug()<<filesize; quint64 xiaoshu= filesize*1; double indexNow = 0; if(num == 1) { indexNow = (filesize-xiaoshu%2)/2+ xiaoshu%2; qDebug()<<indexNow; } out.seek(quint64(indexNow)); filedata += out.read(quint64(filesize/2)); qDebug()<<"pos:"<<out.pos(); //indexNow += filesize/2/10; emit showfileText(filedata.length()); file.close(); }
这段代码读取文件没有弄好,就是读取文件的时候,线程一会读的超界。我给定的是10306,但是最后游标(pos)显示的是10412,并不懂为啥read规定了大小只有,还会读的超界。
updata - 6.2
已经解决了上面的问题,就是新建两个类thread,thread2,进行读取,然后把文本的打开方式| QIODevice::Text去掉,因为一般的文件按照这个格式打开会有格式错乱,导致了读取数量不同。
相关文章推荐
- Qt实现读取显示obj文件——多线程加载纹理
- 文件与目录操作命令;文本处理命令;信息显示命令
- Qt 通过打开文件对话框,实行拖拽到textEdit显示文本或者点击文件显示文本
- Django中,图片显示问题--Django中静态文件处理方法指南
- [Android] 针对生成的图片文件在系统Gallery不显示的处理
- 用 Qt 中的 QDomDocument类 处理 XML 文件(下)
- QT读取txt文本,并且显示
- 多线程 + java nio 实现按行读取并处理超大文件
- 图像编程学习笔记1——bmp文件结构处理与显示
- linux文件权限所属用户用户组全部显示为乱码处理办法
- 解决qt中ui界面中有对象名,cpp文件中还是显示没有成员的方法
- 【.Net码农】SWFUpload 在IE9下不显示问题及IE9中模态窗下flash文件选择问题的处理
- PHP读取txt文本文件并分页显示的方法
- swt浏览文件 显示文件目录 swt显示图片以及图片缩放处理
- Qt 富文本处理(二)
- qt通过pri文件实现预编译处理
- utraedit不小心把打开文件列表弄得不显示的处理办法
- 利用Qt的标准文件对话框及OpenCV创建窗口并显示图片
- Qt实现显示处理提示界面
- 通过内存映射文件来颠倒文本内容(暂没有处理Unicode和换行符)