社区
Qt
帖子详情
一个关于不同线程对象间的通信问题... ...
suuare
2019-12-23 02:41:52
最近搞一个项目,很多地方用到并发处理,所以程序中有很多线程。同时采用了观察者模式用于通知主线程以更新图形化显示。按照QThread的用法,从QObject继承的对象调用moveToThread就可以使之存在于一个独立线程中,问题是被观察者调用notify函数时是间接调用了观察者的update,而被观察者于观察者有可能不在同一个线程中,这样直接调用会不会出问题呢?虽然程序运行看起来没啥问题,但还是觉得不放心,欢迎讨论!
...全文
556
4
打赏
收藏
一个关于不同线程对象间的通信问题... ...
最近搞一个项目,很多地方用到并发处理,所以程序中有很多线程。同时采用了观察者模式用于通知主线程以更新图形化显示。按照QThread的用法,从QObject继承的对象调用moveToThread就可以使之存在于一个独立线程中,问题是被观察者调用notify函数时是间接调用了观察者的update,而被观察者于观察者有可能不在同一个线程中,这样直接调用会不会出问题呢?虽然程序运行看起来没啥问题,但还是觉得不放心,欢迎讨论!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
比菜鸟还菜
2020-01-14
打赏
举报
回复
观察者模式的本质还是类指针的调用。跨线程时类指针被调用函数是处于调用者的线程,当多个线程读写该类的资源,一样有崩溃的问题出现。建议在被观察者的通知函数中加上队列信号,把信号发到被观察者本身的线程再进行操作。
King_zkk
2020-01-13
打赏
举报
回复
理解一下观察者模式的本质就知道没有问题了,观察者模式其实是object之间的函数回调,能register说明这些对象是线程间共享的。信号与槽本质也是差不多。鄙人理解如此,只做讨论交流
lwydezh
2019-12-30
打赏
举报
回复
同意1楼,在Qt多线程下,推荐采用signal-slot的通信方式。
donwmufromdying
2019-12-24
打赏
举报
回复
moveToThread只是让该对象挪入到目标线程内,目标线程对象需要start后才真正线程启动自己的event loop。此时最好是使用signal-slot来进行跨线程调用
鸿蒙中的并发
线程
间
通信
、
线程
间
通信
对象
并发
线程
间
通信
,
线程
间
通信
对象
、Worker、TaskPool
[QT编程系列-27]:多
线程
机制 - 信号与槽实现
不同
对象
之
间
通信
的五种情形:
线程
内同步
通信
、
线程
内异步
通信
、
线程
间
异步
通信
直接连接,当SenderObject
对象
发射sendMessage信号时,信号首先被缓存到
线程
的信号队列,并直接返回,ReceiverObject
对象
的onMessageReceived槽函数将被
线程
的信号队里查询函数调用,并传递相应的参数,因此会出现异步延时!总而言之,
线程
的信号队列是Qt中跨
线程
异步
通信
的机制,它通过将信号封装为事件
对象
,将事件放入目标
线程
的信号队列中,并在目标
线程
的事件循环中处理,实现了
线程
间
的安全
通信
。接收者
线程
的事件循环:目标
线程
中需要运行事件循环,才能及时处理信号队列中的事件。
鸿蒙开发基础 —— 并发
线程
间
通信
(
线程
间
通信
对象
)
转移方式性能更高,但是原
线程
不能再访问ArrayBuffer
对象
,如果两个
线程
都需要访问,则需要采用拷贝方式,否则建议采用转移方式,提升性能。此时,NativeBinding
对象
跨
线程
传输后,只需要重新创建JS壳,就可以桥接到C++
对象
上,不过原
对象
需要移除对此
对象
的绑定关系。在ArkTS中,TaskPool传递ArrayBuffer数据时,默认使用转移的方式,通过调用setTransferList()接口,指定对应的部分数据传递方式为转移方式,其余部分数据可以切换成拷贝的方式。
Java多
线程
间
的
通信
Java多
线程
间
的
通信
Java还提供了一种
线程
间
通信
的机制,这种
通信
通什么实现? wait,notify等机制 或使用pipeInputStream和pipeOutputStream 1.
线程
的几种状态
线程
有四种状态,任何
一个
线程
肯定处于这四种状态中的一种: 1) 产生(New):
线程
对象
已经产生,但尚未被启动,所以无法执行。如通过new产生了
一个
线程
对象
后没
【鸿蒙基于API 13实战开发】—— 并发
线程
间
通信
(
线程
间
通信
对象
)
普通
对象
跨
线程
时通过拷贝形式传递,两个
线程
的
对象
内容一致,但是指向各自
线程
的隔离内存区
间
。例如Ecmascript262规范定义的Object、Array、Map等
对象
是通过这种方式实现跨并发实例
通信
的。
通信
过程如下图所示:
Qt
21,501
社区成员
26,692
社区内容
发帖
与我相关
我的任务
Qt
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
复制链接
扫一扫
分享
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章