【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();
});