Чтение больших файлов - PullRequest
3 голосов
/ 10 ноября 2010

Я хочу прочитать файл размером 50 МБ и отправить его по протоколу TCP.Файл содержит только поплавки.Сначала я создал только Mainwindow, ведьма читает одну строку и отправляет ее на сервер, но графический интерфейс завис.Поэтому я создал класс, который зависит от 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());
}

Но сбой программы в методе qregion::qt_region_strictContains(const QRegion &region, const QRect &rect)

Метод чтения файла, как будто я делаю неправильно?

Спасибо за помощь.

1 Ответ

5 голосов
/ 10 ноября 2010

Во-первых, вам не нужно создавать подкласс QThread. Документация Qt вводит в заблуждение по этому вопросу . См. Этот принятый ответ для аналогичного вопроса для большого количества полезной информации.

Во-вторых, вы можете правильно получить доступ к графическому интерфейсу только из основного потока, поэтому ваш вызов qlblRef->setText() будет проблемой. Доступ к графическому интерфейсу из потока, отличного от основного, может быть выполнен с использованием сигналов и слотов или postEvent () . Вы можете прочитать о событиях здесь .

Наконец, эта документация действительно требует чтения для работы с потоками в Qt. Обратите особое внимание на раздел о потоков и QObjects .

Дополнительно:

Чтобы следовать приведенному выше совету, вы, безусловно, можете заключить код чтения файла в подкласс QObject. Альтернативой (с которой у меня мало опыта) может быть попытка поместить ваш код в QtConcurrent :: run () и получить результат с помощью QFuture .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...