阅读大文件

Pau*_*ker 3 c++ qt qt4

我想读取一个50MB的文件并通过tcp发送.该文件仅包含浮点数.首先我创建了一个Mainwindow,女巫读取一行并将其发送到服务器,但gui被冻结了.所以我创建了一个依赖于QThread的类,叫做QSendThread.这是QThread类的代码:

#ifndef QSENDTHREAD_H
#define QSENDTHREAD_H

#include <QThread>
#include <QLabel>
#include <QFile>
#include <QMessageBox>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QHostAddress>

class QSendThread : public QThread
{
 Q_OBJECT

public:
 QSendThread(QTcpSocket* qtcpso, QLabel* qlbl, QFile* qfiel, QObject *parent = NULL);
 ~QSendThread();

protected:
 void run(void);

private:
 QTcpSocket* qtcpsoDest;
 QLabel* qlblRef;
 QFile* qfileRef;

signals:
 void error(QString qstrError);
};

#endif // QSENDTHREAD_H

#include "qsendthread.h"

QSendThread::QSendThread(QTcpSocket* qtcpso, QLabel* qlbl, QFile* qfile, QObject *parent)
 : QThread(parent)
{
 qtcpsoDest = qtcpso;
 qlblRef = qlbl;
 qfileRef = qfile;
}

QSendThread::~QSendThread()
{
}

void QSendThread::run(void)
{
 int iLine = 0;

 do
 {
  QByteArray qbarrBlock;
  QDataStream qdstrmOut(&qbarrBlock, QIODevice::WriteOnly);

            // show witch line is read
  qlblRef->setText(tr("Reading Line: %1").arg(++iLine));

  qdstrmOut.setVersion(QDataStream::Qt_4_6);
  qdstrmOut << (quint16)0;
  qdstrmOut << qfileRef->readLine().data();
  qdstrmOut.device()->seek(0);
  qdstrmOut << (quint16)(qbarrBlock.size() - sizeof(quint16));

  qtcpsoDest->write(qbarrBlock);
  qtcpsoDest->flush();

  qbarrBlock.clear();
 } while(!qfileRef->atEnd());
}
Run Code Online (Sandbox Code Playgroud)

但程序在方法中崩溃了 qregion::qt_region_strictContains(const QRegion &region, const QRect &rect)

读取文件的方法就像我做错了吗?

感谢帮助.

Arn*_*nce 5

首先,您不应该真正需要继承QThread.Qt文档在这一点上具有误导性.有关很多好消息的类似问题,请参阅此接受的答案.

其次,你只能从主线程正确访问gui,这样你的调用qlblRef->setText()就成了问题.可以使用信号和槽postEvent()来完成从主线程以外的线程访问gui .你可以在这里阅读活动.

最后,这个文档真的需要阅读在Qt中使用线程.特别注意有关线程和QObject的部分.

加成:

要遵循上面的建议,您当然可以将文件读取代码包装在QObject子类中.另一种选择(我对自己没有什么经验)可能是尝试将您的代码放在QtConcurrent :: run()中并使用QFuture获取结果.