我使用QT进行
数据读写,添加了进度条
界面,由于
文件比较大,运行时界面卡死,然后我就采用多
线程的方式:使用一个新建的进程专门读写文件,并发送信号,主界面用于在接收到信号后更新进度条进度。但是运行了以后还是卡死,按理说不应该卡的,不知道是什么原因导致的。求大神指点啊。。。
代码大致如下:
.h文件:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include<qthread.h>#include<qstring.h>#include<sys/time.h>namespace Ui {
class Widget;}
class ReadFileThread:
public QThread{
Q_OBJECTpublic:
quint32 readprocess;
QString filenamepath;
// double process;
signals:
void tellProcess(
double);
protected:
void run();
};
class Widget :
public QWidget{
Q_OBJECTpublic:
explicit Widget(
QWidget *parent
=
0);
~
Widget();
ReadFileThread readFileThread;
void readFileThread_begin();
QString fileNamePath;
//用于通过UI获取文件路径并进一步传给读文件的进程。private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked();
void processBarFlush(
double);
private:
Ui::
Widget *
ui;};
#endif // WIDGET_H
下面是.cpp文件
#include "widget.h"#include "ui_widget.h"#include"QFileDialog"#include<qdebug.h>#include<qfile.h>#include<qtextcodec.h>#include<qmessagebox.h>Widget::Widget(
QWidget *parent)
:
QWidget(parent),
ui(
new Ui::
Widget)
{
ui->setupUi(
this);
ui->
progressBar->setValue(
0);
//ui->progressBar->hide();}
Widget::~
Widget()
{
delete ui;
readFileThread.destroyed();
}
void Widget::on_pushButton_2_clicked()
{
QString s_name=
QFileDialog::getOpenFileName(
this,
"打开",
"/",
"SeaBat7125数据文件(*.s7k)");
ui->
label_3->setText(s_name);
fileNamePath=s_name;
//filenamepath=s_name;}
void Widget::on_pushButton_clicked()
{
if(
ui->
label_3->text().right(
4)!=
QString(
".s7k"))
{
QMessageBox::information(
this,
"警告",
"无效文件!",
QMessageBox::
Yes);
return;
}
ui->
label_4->setText(
"正在读取s7k文件...");
ui->
progressBar->show();
readFileThread.
filenamepath=
fileNamePath;
readFileThread_begin();
if(
readFileThread.isFinished())
{
//ui->progressBar->hide(); if(
readFileThread.
process>=
1)
ui->
label_4->setText(
ui->
label_3->text().right(
19)+
"文件读取完成!!!");
else ui->
label_4->setText(
ui->
label_3->text().right(
19)+
"文件读取失败!!!");
}
//ui->progressBar->hide();}
void Widget::processBarFlush(
double processBarValue)
{
if(
ui->
progressBar->value()<
1)
{
ui->
progressBar->setValue(processBarValue);
}
}
void Widget::readFileThread_begin()
{
QObject::connect(&
readFileThread,
SIGNAL(tellProcess(
double)),
this,
SLOT(processBarFlush(
double)));
readFileThread.start();
readFileThread.wait();
}
void ReadFileThread::
run()
{
quint32 drf_size;
quint32 drf_od_id;
// QVector<quint8> drf_time_tag(10); quint32 drf_rt_id;
quint64 file_size;
//s7k文件大小 QFile file(
filenamepath);
//下面用于新建txt文档,用于读出数据的存储 QFile fpos(
"C:\\Users\\Administrator\\Desktop\\position.txt");
QFile fson_set(
"C:\\Users\\Administrator\\Desktop\\sonar_setting.txt");
QFile fbathy(
"C:\\Users\\Administrator\\Desktop\\bathymetry.txt");
QFile fbeamf(
"C:\\Users\\Administrator\\Desktop\\beamformed_data.txt");
QFile fsnipp(
"C:\\Users\\Administrator\\Desktop\\snippet_data.txt");
....文件读写的部分代码,在此省略 while(read_size<file_size)
//while(!s7k_stream.atEnd()) {
....文件读写的部分代码,用于循环读写,内容较多在此省略 read_size+=drf_size;//每循环一次更新一次已读的字节数
double processBarValue=read_size/file_size;
if(processBarValue<=
1)
emit tellProcess(processBarValue); //发送进度信号
msleep(
10);
}
process=read_size/file_size;
file.
close();
fpos.
close();
fson_set.
close();
fbathy.
close();
fbeamf.
close();
fsnipp.
close();
}
界面如下: