热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QNetworkAccessManager的异步与线程

Qt版本5.1.1以HTTP操作为例Qt中的HTTP操作都是异步的.内部通过线程实现创建线程的时机在QNetworkReplyHttpImplPrivate::postReques

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::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.



推荐阅读
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • com.hazelcast.config.MapConfig.isStatisticsEnabled()方法的使用及代码示例 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 在Java基础中,私有静态内部类是一种常见的设计模式,主要用于防止外部类的直接调用或实例化。这种内部类仅服务于其所属的外部类,确保了代码的封装性和安全性。通过分析JDK源码,我们可以发现许多常用类中都包含了私有静态内部类,这些内部类虽然功能强大,但其复杂性往往让人感到困惑。本文将深入探讨私有静态内部类的作用、实现方式及其在实际开发中的应用,帮助读者更好地理解和使用这一重要的编程技巧。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
author-avatar
关注前世男友
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有