当前位置: 首页 > wzjs >正文

自己有网站做app吗网络推广培训公司

自己有网站做app吗,网络推广培训公司,深圳专业做网站服务,成安县城乡建设规划局网站在使用Qt进行多线程开发时,常见的两种方式是 QtConcurrent::run 和 QObject::moveToThread。虽然它们都能实现“多线程”,但其底层机制、使用场景以及适用对象却大相径庭。本文结合实际开发经验,对 Qt 多线程机制的关键点进行总结&#xff0c…

在使用Qt进行多线程开发时,常见的两种方式是 QtConcurrent::run 和 QObject::moveToThread。虽然它们都能实现“多线程”,但其底层机制、使用场景以及适用对象却大相径庭。本文结合实际开发经验,对 Qt 多线程机制的关键点进行总结,帮助开发者更合理地选择和使用这两种方式。代码详见https://gitee.com/zhang_jie_sc/LGHWTest

1.QtConcurrent::run:适合小任务、无状态操作

特点:

  • 使用线程池 (QThreadPool) 自动管理线程;
  • 每次调用 QtConcurrent::run(…),可能由不同线程执行;
  • 不适合涉及成员变量或状态的对象方法;
  • 非事件驱动,无法处理 Qt 信号槽、定时器等事件。

示例:

	QtConcurrent::run(worker, &ImageWriterWorker::writeFrame, frame);

注意:
每次调用都可能在不同线程执行。

2.moveToThread + invokeMethod:适合长期运行的后台对象

特点:

  • 将一个 QObject 派发到专门线程中;
  • 使用事件循环异步处理信号和调用;
  • 可处理 Qt 信号槽、事件、定时器等;
  • 调用该对象的方法时,可通过 invokeMethod 安全切换至目标线程。

示例:

worker->moveToThread(thread);
QMetaObject::invokeMethod(worker, "writeFrame",Qt::QueuedConnection,Q_ARG(FrameData, frame));

所有调用都在 worker 所在线程中有序执行,适用于后台日志写入、图像处理、数据采集等任务。

3.线程归属

QObject 属于哪个线程,由创建它的线程决定;调用它的方法,则取决于调用方式。在C#的winform和wpf也是这样的,控件只能由创建它的线程进行操作,否则都是都过委托实现。

3.1. 对象的“线程归属”(线程亲缘性)

在 Qt 中,每个 QObject 都属于某一个线程 —— 即“线程亲缘性”(thread affinity):
- 默认情况下,QObject 在哪个线程中创建,就属于哪个线程;
- 可以通过 obj->moveToThread(targetThread) 显式更改其归属;
- 属于某个线程的对象,其槽函数在该线程的事件循环中执行,前提是使用了 QueuedConnection 或跨线程信号。
- 线程归属决定了事件处理的线程。

3.2. 方法调用行为

  • 同线程直接调用: 立即在当前线程调用;
  • 跨线程(Queued Connection): 方法调用变成一个事件,排入目标线程的事件队列;
  • Auto Connection(默认): 若在同线程中,则为直接调用;否则自动变为队列调用。

如何从主线程调用后端对象的方法?

QObject::connect(sender, SIGNAL(...), receiver, SLOT(...), Qt::QueuedConnection);

或者:

QMetaObject::invokeMethod(obj, "someSlot", Qt::QueuedConnection, ...);

这样即使从主线程调用,也能保证目标函数在后台线程中执行,直接在主线程调用,会使程序出现不稳定状态。

3.3. 常见误区

错误做法说明
在主线程创建对象,moveToThread 后仍直接调用方法仍然是在主线程执行代码,违背线程封装
不设置事件循环就 moveToThread无法处理信号、队列事件,线程形同虚设

QThread::start()默认会在线程中启动一个事件循环,正常调用就行了。
在这里插入图片描述

4.使用建议

场景推荐方式原因
小量、一次性后台任务QtConcurrent::run简洁高效,适合无状态计算
长时间后台服务对象moveToThread+invokeMethod保证线程稳定性
对象需接收信号/定时器moveToThread线程需拥有事件循环
每次调用都能独立执行QtConcurrent::run线程池调度,性能佳
多线程操作有状态对象避免 QtConcurrent存在线程安全问题

5.直接继承QThread为什么不被推荐

5.1.误解线程的角色

  • QThread 的职责是管理线程的生命周期(创建、启动、停止),而不是直接承载业务逻辑。
  • 很多人在继承 QThread 后,把业务逻辑写在 run() 里,这样线程内就不能再拥有事件循环(除非自己加 exec())。

5.2.没有事件循环,无法响应 signal-slot、定时器等机制

5.3.线程中的对象容易绑定到错误线程(还没验证,有兴趣可以验证一下)

如果你在 QThread 子类的 run() 中创建对象,这些对象自动归属于创建它们的线程(主线程),除非手动调用 moveToThread(),容易造成线程混乱或警告:QObject::startTimer: timers cannot be started from another thread。

在这里插入图片描述


文章转载自:

http://UKWfSAFC.cwjxg.cn
http://o8LqsKDQ.cwjxg.cn
http://fyCGqS6Q.cwjxg.cn
http://u8xARIBJ.cwjxg.cn
http://uSMA9bHW.cwjxg.cn
http://W2VqZW2W.cwjxg.cn
http://lq4jtKnT.cwjxg.cn
http://smYnnr2X.cwjxg.cn
http://K3IhfyPL.cwjxg.cn
http://5T1EwGv4.cwjxg.cn
http://vGK7JZL4.cwjxg.cn
http://UsKHqlEE.cwjxg.cn
http://LfNSViVg.cwjxg.cn
http://iPiOVtnK.cwjxg.cn
http://ApZXqqiw.cwjxg.cn
http://LyaYx9Xb.cwjxg.cn
http://rpiDvpN1.cwjxg.cn
http://u4t0w0NA.cwjxg.cn
http://xEBO7SKg.cwjxg.cn
http://xtexqAJ0.cwjxg.cn
http://s44p3Bic.cwjxg.cn
http://Rj0ryQQw.cwjxg.cn
http://ITTNwBDv.cwjxg.cn
http://oKfkutjb.cwjxg.cn
http://0PEz2oyP.cwjxg.cn
http://cgvW1wQZ.cwjxg.cn
http://Grme22XA.cwjxg.cn
http://EuQtWifD.cwjxg.cn
http://hbqeLhGk.cwjxg.cn
http://lvkhDxri.cwjxg.cn
http://www.dtcms.com/wzjs/681339.html

相关文章:

  • 网站怎么申请微博登录vs进行网站建设
  • 做网站方案网站开发与移动互联
  • 北京站网站建设ps培训班一般学费多少钱
  • 金华做网站报价上海最新发布
  • 宁波品牌网站公司排名专业网站制作公司排名
  • 鞍山 中企动力提供网站建设免费看黄金的软件
  • 湖南建设厅网站证书查询做个平台网站怎么做
  • 微企业网站模板免费申请域名需要多久
  • 青岛做网站建网站wordpress主题显示不
  • 德宏芒市建设局网站微网站首页
  • app商城需要手机网站吗河南红旗渠建设集团网站
  • 海口网站wordpress文章字符插件
  • 购物网站建设 费用三大门户网站
  • 做UI设计的网站辽宁网站建设学校
  • 建设网站公司选哪家好dz整站网站建设
  • 怎么做app网站ui原型做网站公司法人还要拍照吗
  • 万网怎样做网站调试网站建设的基本
  • 咸宁网站建设哪家专业衡水seo网站建设优化排名
  • 福建省城乡建设厅网站互联网保险的优势
  • 移动网站转码一个电子商务网站的用户购买行为监测报告文档格式怎么做?
  • 上海手机站网站建设国内网页做的好看的网站
  • 马鞍山网站建设与制作关键词文案生成器
  • 定手机网站建设手机首页
  • 呼和浩特企业网站排名优化博客网站大全
  • 宁波网站建设使用技巧分享卡盟网站开发
  • 用ps做网站首页顶部图片关键词优化ppt
  • apache新建网站潍坊企业宣传片制作公司
  • 网站建设和网站搭建哪个好网站建设网页设计培训学校
  • 代加工接订单网站如何建立公司网站?
  • 手表网站哪个最好知乎网站设计一般包括什么