我想读取一个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 ®ion, const QRect &rect)
读取文件的方法就像我做错了吗?
感谢帮助.
首先,您不应该真正需要继承QThread.Qt文档在这一点上具有误导性.有关很多好消息的类似问题,请参阅此接受的答案.
其次,你只能从主线程正确访问gui,这样你的调用qlblRef->setText()就成了问题.可以使用信号和槽或postEvent()来完成从主线程以外的线程访问gui .你可以在这里阅读活动.
最后,这个文档真的需要阅读在Qt中使用线程.特别注意有关线程和QObject的部分.
加成:
要遵循上面的建议,您当然可以将文件读取代码包装在QObject子类中.另一种选择(我对自己没有什么经验)可能是尝试将您的代码放在QtConcurrent :: run()中并使用QFuture获取结果.