最近发现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相关推荐

  1. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

    重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在这个线 ...

  2. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析2)

    Qt事件机制 QT-UI 后端 重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程&quo ...

  3. java线程的异常无法捕获异常_Java如何从线程中捕获异常

    我有Java主类,在该类中,我启动了一个新线程,在主类中,它等待线程死亡.在某个时刻,我从线程中抛出了运行时异常,但是我无法在主类中捕获从线程中抛出的异常. 这是代码: public class Te ...

  4. DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁

    之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因.是否还记得,我们分析了半天汇编才知道在线程中的死锁位置.如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦.那么本文就介 ...

  5. 获取线程中抛出的异常信息

    1 ScheduledExecutorService service = Executors.newScheduledThreadPool(10); 2 // 从现在开始delay毫秒之后,每隔一天执 ...

  6. python3线程中的锁机制

    1.锁的形象解释 有一个奇葩的房东,他家里有两个房间想要出租.这个房东很抠门,家里有两个房间,但却只有一把锁,不想另外花钱是去买另一把锁,也不让租客自己花钱加锁.这样租客只有先租到的那个人才能分配到锁 ...

  7. python如何次传参给线程_python如何给线程中的函数传参?

    1.Process说明 (1)概念 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. (2)语法([group [, target [, name [, args [, k ...

  8. 用Handler的post()方法来传递线程中的代码段到主线程中执行

    自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法 ...

  9. 一个线程中lock用法的经典实例

    1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...

最新文章

  1. 在Ubuntu 16.04.5 LTS上使用python第三方库QRCode 6.0生成二维码实录
  2. struts2文件上传一个错误的解决
  3. 蓝牙配对码配置错误_安卓系统蓝牙配对流程分析
  4. 一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析
  5. 软件项目管理课后题下载【共5个章(1、3、4、5、6)】
  6. java运算符试题,编程语⾔⾯试题之新版javase基础语法篇之运算符
  7. 如何实现一个简单的RPC
  8. Ftrace Kernel Hooks: More than just tracing
  9. SSM框架之Spring MVC(二)常用注解说明
  10. 价格穿越,跟 普通的大于 小于是有差别的
  11. 猫咪藏在哪个房间python作业_深度学习(可视化部分)-使用keras识别猫咪
  12. Python执行Linux系统命令方法
  13. java 打印字体中的字_输入文字,输出点阵文字
  14. VlanIF和Vlan间路由
  15. 贴片钽电容封装、尺寸
  16. 太阳能逐日自动跟踪系统,太阳能光伏追光追日发电实训系统
  17. 解密邮件群发小技巧?邮件群发单显功能如何设置?
  18. js获取元素下的第一级子元素
  19. 基于linux的oracle_rac实时应用集群研究,基于Linux的OracleRAC实时应用集群研究毕业设计论文...
  20. 商业贷款买房的7个步骤

热门文章

  1. 小程序入门学习14--用户管理
  2. Linux搭建smb共享ftp服务器——windows无法写入samba共享路径 无操作权限的问题解决
  3. 3张经典人事管理模板,HR都直呼很好用
  4. 裁员潮来袭!IT行情雪崩之下,我靠它竟能逆向突破职业危机
  5. 使用ByteArray及AMF来提高Data Object的操作效率
  6. 颜色叠加 java_可绘制Android上的颜色叠加
  7. asp.net 读取mysql_asp.net封装mysql工具类,在页面上引用读取的数据
  8. python自动化控制_python用于自动化控制编程
  9. 计算机科学与技术专业实训手册,计算机科学与技术专业实习计划
  10. 软件工程导论 02章可行性研究