首页| 论坛| 消息
主题:qt5 多线程下载 QNetworkReply readAll后程序崩溃 [
ubuntu爱好者发表于 2014-04-12 00:43
现在使用qt5.2做一个多线程下载的软件,使用的是QNetworkAccessManager、QNetworkRequest、QNetworkReply这三个类首先通过QNetworkReply的header函数获取到要下载的文件大小,然后分成多个线程下载,在下载的线程中,把reply的readyRead信号与写入文件的槽连接起来,每次有数据过来的时候就将数据写入文件中
QNetworkAccessManager * manager = new QNetworkAccessManager;QNetworkRequest request;request.setUrl(url);
QString strData = QString( "bytes=%0%1" ).arg( startByte ).arg( endByte );
request.setRawHeader("Range", strData.toLatin1() );//toAscii toLatin1
//request.setRawHeader("User-Agent" ,"Mozilla/5.0 Firefox/7.0.1 Chrome/24.0.1312.60 ");
/*Range用于请求头中,指定第一个字节的位置和最后一个字节的位置*/
/*if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)*/
reply = manager->get( request );
if( ! reply ) return;
connect( reply, SIGNAL( readyRead() ), this, SLOT( writeToFile() ) );
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadProgress(qint64,qint64)));
connect( reply, SIGNAL( finished() ), this, SLOT( finishedDownload() ) );
this->exec();
写入文件的代码如下:
void HttpThread::writeToFile()
{
if (reply->bytesAvailable()>0)
{
QByteArray tempArry = reply->readAll();
lock.lockForWrite();
file->seek(this->startByte+this->doneBytes);
file->write(tempArry);lock.unlock();
this->doneBytes += tempArry.size();
emit this->progressChanged(tempArry.size());
}
}
当reply发出finished信号后,结束本线程,调用deleteLater函数delete掉reply通知父类,如果所有线程都下载完成则关闭文件void HttpThread::finishedDownload()
{
reply->deleteLater();
emit finish(true);
this->quit();
}
目前发现的问题就出现在上面的写入文件中的reply->readAll()函数,只要使用了这个函数,程序就崩溃(下载小文件没事,下载大文件时间久了就崩溃),报的错误有三种:1)无效的指针(我记录了这个指针,每次都是不一样的),2)double free。。。,3)直接异常结束,没有错误提醒。
现在问题就是,reply的read、readAll、readData,ReadLine等读取数据的函数都使用过了,都会崩溃,如果不使用这几个函数的话程序是没有问题的(当然啦,读不了数据)连续下载20个以上的小文件是没有问题的,但是同时下载几个大于1G的文件基本就会崩溃我在下面会放上源代码,希望有了解这方面的大大可以给出比较详细的解决方法,谢谢大家
(测试环境Qt5.2,LinuxDeepin,ubuntu12.04,fedora20)
附件: downloadtest.zip (53 K) 下载次数:115
回帖(9):
9楼:ubuntu爱好者:此问题已经解决
原因是reply跟manager这两个对象是在run函数中new出来的,按照 ..
8楼:感谢分享
7楼:

全部回帖(9)»
最新回帖
收藏本帖
发新帖