gpt4 book ai didi

c++ - 读取大文件

转载 作者:太空狗 更新时间:2023-10-29 20:48:03 24 4
gpt4 key购买 nike

我想读取一个 50MB 的文件并通过 tcp 发送它。该文件仅包含 float 。首先,我只创建了一个主窗口,女巫读取一行并将其发送到服务器,但是 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());
}

但是程序在方法qregion::qt_region_strictContains(const QRegion &region, const QRect &rect)

中崩溃

像我这样读取文件的方法是不是做错了?

感谢您的帮助。

最佳答案

首先,您真的不需要子类化 QThread。 Qt 文档是 misleading on this point .看这个accepted answer对于很多有用信息的类似问题。

其次,您只能从主线程正确访问 gui,因此您的调用 qlblRef->setText() 将是一个问题。从主线程以外的线程访问 gui 可以使用 signals and slots 完成。或 postEvent() .您可以阅读事件 here .

最后,这个documentation在 Qt 中使用线程确实需要阅读。请特别注意关于 threads and QObjects 的部分.

添加:

要遵循上述建议,您当然可以将文件读取代码包装在 QObject 子类中。另一种方法(我对自己没有什么经验)可能是尝试将您的代码放入 QtConcurrent::run()并通过 QFuture 得到结果.

关于c++ - 读取大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4141844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com