提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
使用qt QNetworkAccessManager下载大文件后并写入文件,通过free查看系统内存会增加,通过echo 3 > /proc/sys/vm/drop_caches清除缓存仍无效果,请大神指点,可能出现的问题在哪里?
一、步骤
1.下载
代码如下(示例):
void download(QString url)
{
…
fileReply = fileNetMgr->get(request);
fd = open("/mnt/app/Download/1.pdf",O_RDWR | O_SYNC | O_APPEND | O_CREAT, 0666);
connect(fileReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()),Qt::QueuedConnection);
connect(fileReply, SIGNAL(finished()), this, SLOT(onFinished()),Qt::QueuedConnection);
connect(fileReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
}
2.写文件
代码如下(示例):
void onReadyRead()
{
if(pfContentLength == 0){
pfContentLength = fileReply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
}
QByteArray data = fileReply->readAll();
write(fd,data.data(),data.size());
pfReceivedSize += data.size();
}
void onFinished()
{
if(pfContentLength == 0){
pfContentLength = fileReply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
}
QByteArray data = fileReply->readAll();
write(fd,data.data(),data.size());
pfReceivedSize += data.size();
if(pfReceivedSize == pfContentLength && pfContentLength != 0){
close(fd);
fileReply->deleteLater();
dropCache();
m_finished = true;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
DlTest* t = new DlTest;
QString url = argv[1];
t->download(url);
QProcess p;
while(true)
{
if(t->finished())
{
t->memInfo();
delete t;
QString cmd = "/bin/sh -c free";
p.start(cmd);
p.waitForFinished();
qDebug() << p.readAllStandardOutput();
break;
}
else
{
QCoreApplication::processEvents();
}
}
return a.exec();
}
总结
求大神指点 !!!