Qt版本5.1.1

以HTTP操作为例

Qt中的HTTP操作都是异步的. 内部通过线程实现

创建线程的时机在QNetworkReplyHttpImplPrivate::postRequest()

void QNetworkReplyHttpImplPrivate::postRequest()
{Q_Q(QNetworkReplyHttpImpl);QThread *thread = 0;if (synchronous) {// A synchronous HTTP request uses its own threadthread = new QThread();thread->setObjectName(QStringLiteral("Qt HTTP synchronous thread"));QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));thread->start();} else if (!managerPrivate->httpThread) {// We use the manager-global thread.// At some point we could switch to having multiple threads if it makes sense.managerPrivate->httpThread = new QThread();managerPrivate->httpThread->setObjectName(QStringLiteral("Qt HTTP thread"));managerPrivate->httpThread->start();thread = managerPrivate->httpThread;} else {// Asynchronous request, thread already existsthread = managerPrivate->httpThread;}..........// Move the delegate to the http threaddelegate->moveToThread(thread);// This call automatically moves the uploadDevice too for the asynchronous case............
}

分为两种情况: 
(1) synchronous == true 每次HTTP请求创建自己的线程, 并在finished后自动退出线程

在QNetworkRequest设置QNetworkRequest::SynchronousRequestAttribute 属性为真时, synchronous = true, 然而SynchronousRequestAttribute被Qt标记为internal. 以防止外部创建synchronous HTTP请求. 
我在Qt的源码中找到一点说明, QNetworkReplyHttpImpl的构造函数中.

........// Internal code that does a HTTP reply for the synchronous Ajax// in Qt WebKit.QVariant synchronousHttpAttribute = request.attribute(static_cast<QNetworkRequest::Attribute>(QNetworkRequest::SynchronousRequestAttribute));if (synchronousHttpAttribute.isValid()) {d->synchronous = synchronousHttpAttribute.toBool();
........

webkit的ajax请求使用

(2) synchronous == false 则把所有http请求放置在一个线程中.
并且该线程在
QNetworkAccessManagerPrivate对象析构(即QNetworkAccessManager析构)或者调用QNetworkAccessManagerPrivate::clearCache 时退出

QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate()
{if (httpThread) {httpThread->quit();httpThread->wait(5000);if (httpThread->isFinished())delete httpThread;elseQObject::connect(httpThread, SIGNAL(finished()), httpThread, SLOT(deleteLater()));httpThread = 0;}
}void QNetworkAccessManagerPrivate::clearCache(QNetworkAccessManager *manager)
{manager->d_func()->objectCache.clear();manager->d_func()->authenticationManager->clearCache();if (manager->d_func()->httpThread) {manager->d_func()->httpThread->quit();manager->d_func()->httpThread->wait(5000);if (manager->d_func()->httpThread->isFinished())delete manager->d_func()->httpThread;elseQObject::connect(manager->d_func()->httpThread, SIGNAL(finished()), manager->d_func()->httpThread, SLOT(deleteLater()));manager->d_func()->httpThread = 0;}
}

否则会一直HTTP 线程会一直存在. 另外, 每个QNetworkAccessManager对象对应自己的HTTP thread.

QNetworkAccessManager的异步与线程相关推荐

  1. Springboot异步任务线程池

    文章目录 1. 启动类添加@EnableAsync注解 2. 异步方法添加@Async注解 3. 自定义线程池以及线程池异常策略 1. 启动类添加@EnableAsync注解 package com. ...

  2. python线程池原理_Django异步任务线程池实现原理

    这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改 ...

  3. 异步编程-线程实现异步编程

    异步编程-线程实现异步编程 使用线程实现异步 第一种方式 第二种方式 问题 在日常开发中我们经常会遇到这样的情况,即需要异步地处理一些事情,而不需要知道异步任务的结果.比如在调用线程里面异步打日志,为 ...

  4. android并发命令,Android开发实践:基于命令模式的异步任务线程

    关于Android的异步操作,我在文章<Android开发实践:线程与异步任务>中介绍了两种方法,一种是采用线程,另一种是采用AsyncTask,今天再深入探讨下另一种模型:命令式的异步任 ...

  5. 12、Nepxion Discovery 之 Discovery Agent 解决异步场景线程 ThreadLocal 上下文丢失问题

    在进行微服务调用的时候,不管是服务之间(A 服务调用 B 服务)还是服务内部调用(服务 A 某个方法进行里有异步)都存在异步调用.但是 Nepxion Discovery 在进行参数传递的时候很多情况 ...

  6. 8-flutter 异步和线程

    线程和异步的UI 1 异步的使用 Dart 有一个单线程执行模型,支持Isolate(一种在另外一种线程运行dart的方法),一个事件循环和异步编程. 可以使用async / await 来做网络请求 ...

  7. 同步与异步以及线程与进程

    写过爬虫的都知道,爬虫的性能瓶颈在于IO,因为爬虫是一个IO密集型业务,程序需要发起网络请求,必然就有IO阻塞, 通常请求一个URL耗时要几百毫秒到几秒不等,而我们的CPU处理速度惊人,两者的速度就好 ...

  8. 同步异步 阻塞 非阻塞 异步调用 线程队列 协程

    阻塞 非阻塞 阻塞:程序遇到了IO操作 导致代码无法继续执行 交出了COU执行权 非阻塞:没有IO操作 或者即使遇到IO操作 也不阻塞代码执行 阻塞 就绪 运行指的是应用程序所处的状态写程序时 尽量减 ...

  9. JDK 伪异步编程(线程池)

    伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接.在高性能服务器应用领域,往往需要面向成千上万个客户 ...

最新文章

  1. java mdt_MDT 2013 从入门到精通之软件、系统补丁导入
  2. hibernate正向生成数据库表以及配置——Teacher.java
  3. 对二分法思想的体会 及 结队编程情况汇报
  4. 让机器也拥有品味!时尚图像补全网络FiNet| ICCV 2019 Oral
  5. 逛知乎才知网站建设不只有wordpress建站系统,小白值得收藏
  6. 如何为服务器安装mysql数据库文件,如何为服务器安装mysql数据库
  7. matlab画圆函数
  8. mysql更改数据库密码
  9. c语言中逆序乘积,逆序乘积式(示例代码)
  10. mysql数据库查询优化技术 视频教程_炼数成金MySql视频教程 MySQL数据库查询优化技术 15周课程深入学习MySQL数据库查询...
  11. 【洛谷】P4147 玉蟾宫 解题报告
  12. 88e1111 phy芯片在arm平台的配置及接口介绍
  13. Kong的插件:Request Size Limiting
  14. JS 用时间戳计算两个时间之间间隔
  15. plt画网格图_matplotlib子图与多种图形绘制
  16. Wio Terminal 从网络获取天气数据
  17. java异常类关键字_Java中的异常处理关键字是什么?
  18. 【NOIP模拟】行走
  19. smush.it更新
  20. 超简单的魔幻霓虹灯文字特效 html+css

热门文章

  1. Quick Dicom batch editor(DICOM标签浏览编辑器)
  2. Wampserver的安装与配置笔记
  3. phpVX活码系统源码
  4. 中医与佛教共同推出的养生秘诀 100 条
  5. MongoDB 教程二: 添加, 删除,查询 shell命令
  6. 新版《谷歌搜索引擎优化初学者指南》
  7. 斗地主AI算法——第三章の数据处理
  8. 最短路径——Dijkstra算法扩展(hdu2066,poj1062)
  9. 【Windows 命令行】CMD 在资源管理器中打开当前路径
  10. MySQL—修改数据库root用户密码