当前位置: 首页 > article >正文

【QT线程】子线程阻塞主线程的一次网络api请求案例

阻塞源码赏析

这是最近一次项目遇到的问题,原因是我觉得子线程里俩次请求间隔太短了,会引起服务器屏蔽我的api因此,我故作聪明加多了一个延时函数,欢迎各位鉴赏代码。

// 并行发起双请求
QNetworkRequest liveRequest(liveUrl);
liveRequest.setSslConfiguration(sslConfig);
QNetworkReply *liveReply = m_manager->get(liveRequest);

 QThread::msleep(10000);  

QNetworkRequest forecastRequest(forecastUrl);
forecastRequest.setSslConfiguration(sslConfig);
QNetworkReply *forecastReply = m_manager->get(forecastRequest);

// 处理实时响应
connect(liveReply, &QNetworkReply::finished, [this, liveReply]() {
    if (liveReply->error() == QNetworkReply::NoError) {
        QJsonDocument doc = QJsonDocument::fromJson(liveReply->readAll());
        parseLiveData(doc.object());
    }
    liveReply->deleteLater();
});

// 处理预报响应
connect(forecastReply, &QNetworkReply::finished, [this, forecastReply]() {
    if (forecastReply->error() == QNetworkReply::NoError) {
        QJsonDocument doc = QJsonDocument::fromJson(forecastReply->readAll());
        parseForecastData(doc.object());
    }
    forecastReply->deleteLater();
});

下面这个版本才是不会引起主线程阻塞的版本,各位可以分析是什么原因导致了主线程阻塞。


// 串行发起双请求
QNetworkRequest liveRequest(liveUrl);
liveRequest.setSslConfiguration(sslConfig);
QNetworkReply *liveReply = m_manager->get(liveRequest);

// 处理实时响应
connect(liveReply, &QNetworkReply::finished, [this, liveReply]() {
    if (liveReply->error() == QNetworkReply::NoError) {
        QJsonDocument doc = QJsonDocument::fromJson(liveReply->readAll());
        parseLiveData(doc.object());
        QThread::msleep(1000);
    }
    liveReply->deleteLater();
});

QNetworkRequest forecastRequest(forecastUrl);
forecastRequest.setSslConfiguration(sslConfig);
QNetworkReply *forecastReply = m_manager->get(forecastRequest);

// 处理预报响应
connect(forecastReply, &QNetworkReply::finished, [this, forecastReply]() {
    if (forecastReply->error() == QNetworkReply::NoError) {
        QJsonDocument doc = QJsonDocument::fromJson(forecastReply->readAll());
        parseForecastData(doc.object());
    }
    forecastReply->deleteLater();
});

http://www.kler.cn/a/568346.html

相关文章:

  • 自然语言处理算法工程师的技术图谱和学习路径
  • 代码随想录算法训练day66---图论系列10《Bellman_ford 队列优化算法负权回路单源有限最短路》
  • 26、IO流(只是小入门)
  • IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程
  • Ollama 的庐山真面目
  • 【树莓派学习】树莓派3B+的安装和环境配置
  • GIT工具学习【1】:基本操作
  • 数据库Redis数据库
  • 【中等】707.设计链表
  • zookeeper-docker版
  • JVM基础概念作用类加载运行时数据区执行引擎本地方法
  • 5G学习笔记之BWP
  • 【Java基础】Java 中 的`final` 关键字
  • 【计算机网络入门】初学计算机网络(六)
  • 车载电源管理新标杆NCV8460ADR2G 在汽车电子负载开关中的应用
  • 基于STM32单片机物联网智能浇花系统设计
  • 请解释 Node.js 中的网络模块(http、https),如何创建 HTTP服务器?
  • 基于微信小程序的疫情互助平台(源码+lw+部署文档+讲解),源码可白嫖!
  • HTMLS基本结构及标签
  • 【星云 Orbit-F4 开发板】06. 串口密码:USART 数据传递