解决qt进行网络请求时返回的数据过大导致阻塞卡死

2023年10月17日 08:40 ry 534

最近在用qt写一个采集软件,请求一些数据,用python代码请求完全没问题,然后用qt代码进行测试,代码如下所示

void Scraping::getRequest(QString id, QStringList list)
{
  if (id != "") {
    // 省略其他代码...

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkReply* reply = manager->get(request);
    qDebug() << "开始采集";

    // 连接QNetworkReply的finished信号到槽函数
    connect(reply, &QNetworkReply::finished, this, [=]() {
      getData(reply);
      reply->deleteLater(); // 释放reply对象
    });
  }
  else {
    qDebug() << "数据不为空";
  }
}

void Scraping::getData(QNetworkReply *reply)
{
  if (reply->error() == QNetworkReply::NoError) {
    QByteArray data = reply->readAll();
    qDebug() << "result:" << data;
    // 在这里处理返回的数据
  }
  else {
    qDebug() << "请求错误:" << reply->errorString();
  }
}

差不多我就按照这样来的,运行后发现代码一直卡死,等了很久也没有任何反应,然后查阅资料发现是返回的数据过大导致了卡死,为了解决这个问题,我尝试使用QNetworkReplyreadyRead信号来读取返回的数据,而不是在finished信号中一次性读取所有数据,这样可以确保在数据可用时立即读取,而不会阻塞主线程。

修改后的代码如下所示

void Scraping::getRequest(QString id, QStringList list)
{
  if (id != "") {
    // 省略其他代码...

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkReply* reply = manager->get(request);
    qDebug() << "开始采集";

    // 连接QNetworkReply的readyRead信号到槽函数
    connect(reply, &QNetworkReply::readyRead, this, [=]() {
      QByteArray data = reply->readAll();
      qDebug() << "result:" << data;
      // 在这里处理返回的数据
    });

    // 连接QNetworkReply的finished信号到槽函数
    connect(reply, &QNetworkReply::finished, this, [=]() {
      reply->deleteLater(); // 释放reply对象
    });
  }
  else {
    qDebug() << "数据不为空";
  }
}

效果如下所示

完美解决!

如果上述代码帮助您很多,可以打赏下以减少服务器的开支吗,万分感谢!

欢迎发表评论~

点击此处登录后即可评论


评论列表
2023年11月16日 13:26 ry: 回复
本人承接各种软件定制,数据采集,接口搭建,网站开发,环境配置的杂活,需要的可以联系我 qq:1449917271 微信:liuyoudyping


赣ICP备2021001574号-1

赣公网安备 36092402000079号