• 9288阅读
  • 3回复

[提问]qt 使用多线程读数据,界面卡死 [复制链接]

上一主题 下一主题
离线zhcgis
 

只看楼主 倒序阅读 楼主  发表于: 2016-08-21
我使用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_OBJECT
public:    
       quint32 readprocess;    
       QString filenamepath;//    
       double process;
signals:    
       void tellProcess(double);
protected:  
       void run();
};

class Widget : public QWidget
{    
       Q_OBJECT
public:    
       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();
}
界面如下:






离线dyongfly

只看该作者 1楼 发表于: 2016-08-22
  朋友,直接在Qt帮助文档查看QThread,看代码,一看就懂。或者去这里看看别人的博客http://blog.sina.com.cn/s/blog_a6fb6cc90101hohu.html
离线zhcgis

只看该作者 2楼 发表于: 2016-08-24
回 dyongfly 的帖子
dyongfly:  朋友,直接在Qt帮助文档查看QThread,看代码,一看就懂。或者去这里看看别人的博客http://blog.sina.com.cn/s/blog_a6fb6cc90101hohu.html (2016-08-22 23:11) 

谢谢!
离线9715866331

只看该作者 3楼 发表于: 2017-11-17
朋友 ,我也是遇到了和你差不多的情况,我用QThread开了一个线程用来写文件,文件的数据比较多,有时候运行几分钟界面就卡住了,但写文件线程还在写文件,程序并没有崩溃,有时候要运行几个小时才会卡住,请问你是怎么解决界面卡住的问题的?
快速回复
限100 字节
 
上一个 下一个