Qnetworkreply,QnetworkAccessManager- https下载文件 - 高CPU使用情况
QNetworkReply, QNetworkAccessManager - download file by HTTPS - high cpu usage
我使用qnetworkreply和qnetworkAccessManager在C 中创建了文件下载器, qt> qt 5.12.3 。当下载文件启动时,CPU使用率上升到高价值(尤其是在ARM设备上(。
-
桌面-CPU I7@4GHz -Linux操作系统:根据下载速度,CPU使用率为2%-7%。最大下载速度为20 MB/s,平均CPU使用率为5%。在调试和发布构建中,CPU使用量相同。
-
SBC -ARM CPU @1,53GHz -Linux操作系统:根据下载速度,CPU使用率为5%-50%。最大下载速度为20 mb/s,平均CPU使用率为40%。使用发行版构建检查CPU用法。
在QT中下载https或我缺少某些内容时,使用如此高的CPU使用是正常的?
代码:启动文件下载:
qDebug() << "HTTP: starting download FILE" << file_name << "from" << url.toString();
QNetworkRequest req(url);
req.setMaximumRedirectsAllowed(3);
req.setHeader(QNetworkRequest::UserAgentHeader, http_user_agent);
req.setRawHeader("Accept-Encoding", "identity");
req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
const QByteArray range_header_value = "bytes=" + QByteArray::number(curr_file_size) + "-";
req.setRawHeader("Range", range_header_value);
net_reply = nam->get(req);
net_reply->setReadBufferSize(10 * 1024 * 1024);
connect(net_reply, &QNetworkReply::finished, this, &file_downloader::operation_finished);
connect(net_reply, &QNetworkReply::metaDataChanged, this, &file_downloader::metadata_changed);
connect(net_reply, &QNetworkReply::downloadProgress, this, &file_downloader::download_progress);
我每250毫秒从 net_reply
读取内容:
read_buffer.append(net_reply->read(read_buffer_size));
if(read_buffer.size() >= read_buffer_size)
{
const qint64 bytes_written = file->write(read_buffer);
read_buffer.clear();
if(bytes_written == -1)
{
qDebug() << "Error write to FILE:" << file->fileName() << ". Aborting download";
QTimer::singleShot(0, net_reply, &QNetworkReply::abort);
}
}
为了最大程度地减少我尝试使用的CPU用法:
- 在
ReadyRead
信号中读取net_reply,带有/不带缓冲区, - 仅读取net_reply,而无需保存文件,
- 使用
read
功能和readAll
函数读取net_reply, - 在qtCreator中使用CallGrind和Perf Profiler-但两者都以我的代码显示高成本(例如:q_ssl_read,__tpstrtab_dax_pte_fault_done(
通过https下载文件时,任何建议或这些CPU使用情况是正常的?
用wget
和QT下载的CPU用法相同。因此,我认为这是CPU的使用情况。
相关文章:
- 用C++中的一个变量定义一个常量
- 用c++从输入文件中读取另一行
- 用C++20 fmt限制结果的总大小
- 在Windows上用C++裁剪HBITMAP
- 用c++阅读音频
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 试图在visual studio上用C++创建一个桌面应用程序
- 用C++在单独的头文件中完成函数体
- 用C++中的sscanf赋值
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 从父数组测试用例构造二叉树失败
- 用C++将哈希表写入文件并从文件中恢复
- 如何让我用C++编写的图形程序使用GPU而不是CPU进行渲染
- 为什么我的程序设计为用完 RAM 和 CPU 不使用所有 RAM 和 CPU?
- 避免 CPU 争用