在多个线程中使用QNetworkAccessManager
最近发现Tangram发出了URL request, 但是却收不到URL reponse
经研究后发现这是一个线程问题: Tangram会在多个线程发送URL request, 但是在实现时, 却没有考虑线程问题, 程序在运行时得到如下warning:
QObject: Cannot create children for a parent that is in a different thread. (Parent is QNetworkAccessManager(0x21dcba0), parent's thread is QThread(0x20be1c0), current thread is QThread(0x7f48e0044730)
在移植Tangram到Qt平台时, 网络请求使用的是QNetworkAccessManager, QNetworkAccessManager的使用很简单:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
这里碰到的问题是:Tangram可能在多个线程发送URL, 但是QNetworkAccessManager只能在生成它所在的线程中工作, 解决办法是使用Qt的SIGNAL/SLOT机制, 把该URL request post到正确的线程中:
class URLTaskWorker{ public:URLTaskWorker(){connect(this,SIGNAL(startRequest()),this, SLOT(onRequest()), Qt::QueuedConnection);} public:void handleTask(QUrl url){this->url = url;emit StartNewRequest();}signals:void startRequest();private slots:void onRequest(){qnam.get(url);}private:QNetworkAccessManager qnam;QUrl url; };
这里要注意的是, 在connect startRequest和onRequest时, 要使用Qt::QueuedConnection, 使用默认的Qt::AutoConnection不工作, 参考Qt帮助文档:
Qt::QueuedConnection The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
这也是一个Qt的线程安全的在不同线程间传递消息的方法。
转载于:https://www.cnblogs.com/btian/p/6512365.html
在多个线程中使用QNetworkAccessManager相关推荐
- Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)
重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在这个线 ...
- Qt对话框的事件循环分析(子线程中不能创建UI窗体分析2)
Qt事件机制 QT-UI 后端 重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程&quo ...
- java线程的异常无法捕获异常_Java如何从线程中捕获异常
我有Java主类,在该类中,我启动了一个新线程,在主类中,它等待线程死亡.在某个时刻,我从线程中抛出了运行时异常,但是我无法在主类中捕获从线程中抛出的异常. 这是代码: public class Te ...
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因.是否还记得,我们分析了半天汇编才知道在线程中的死锁位置.如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦.那么本文就介 ...
- 获取线程中抛出的异常信息
1 ScheduledExecutorService service = Executors.newScheduledThreadPool(10); 2 // 从现在开始delay毫秒之后,每隔一天执 ...
- python3线程中的锁机制
1.锁的形象解释 有一个奇葩的房东,他家里有两个房间想要出租.这个房东很抠门,家里有两个房间,但却只有一把锁,不想另外花钱是去买另一把锁,也不让租客自己花钱加锁.这样租客只有先租到的那个人才能分配到锁 ...
- python如何次传参给线程_python如何给线程中的函数传参?
1.Process说明 (1)概念 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. (2)语法([group [, target [, name [, args [, k ...
- 用Handler的post()方法来传递线程中的代码段到主线程中执行
自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法 ...
- 一个线程中lock用法的经典实例
1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...
最新文章
- 在Ubuntu 16.04.5 LTS上使用python第三方库QRCode 6.0生成二维码实录
- struts2文件上传一个错误的解决
- 蓝牙配对码配置错误_安卓系统蓝牙配对流程分析
- 一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析
- 软件项目管理课后题下载【共5个章(1、3、4、5、6)】
- java运算符试题,编程语⾔⾯试题之新版javase基础语法篇之运算符
- 如何实现一个简单的RPC
- Ftrace Kernel Hooks: More than just tracing
- SSM框架之Spring MVC(二)常用注解说明
- 价格穿越,跟 普通的大于 小于是有差别的
- 猫咪藏在哪个房间python作业_深度学习(可视化部分)-使用keras识别猫咪
- Python执行Linux系统命令方法
- java 打印字体中的字_输入文字,输出点阵文字
- VlanIF和Vlan间路由
- 贴片钽电容封装、尺寸
- 太阳能逐日自动跟踪系统,太阳能光伏追光追日发电实训系统
- 解密邮件群发小技巧?邮件群发单显功能如何设置?
- js获取元素下的第一级子元素
- 基于linux的oracle_rac实时应用集群研究,基于Linux的OracleRAC实时应用集群研究毕业设计论文...
- 商业贷款买房的7个步骤
热门文章
- 小程序入门学习14--用户管理
- Linux搭建smb共享ftp服务器——windows无法写入samba共享路径 无操作权限的问题解决
- 3张经典人事管理模板,HR都直呼很好用
- 裁员潮来袭!IT行情雪崩之下,我靠它竟能逆向突破职业危机
- 使用ByteArray及AMF来提高Data Object的操作效率
- 颜色叠加 java_可绘制Android上的颜色叠加
- asp.net 读取mysql_asp.net封装mysql工具类,在页面上引用读取的数据
- python自动化控制_python用于自动化控制编程
- 计算机科学与技术专业实训手册,计算机科学与技术专业实习计划
- 软件工程导论 02章可行性研究