一个关于不同线程对象间的通信问题... ...

suuare 2019-12-23 02:41:52
最近搞一个项目,很多地方用到并发处理,所以程序中有很多线程。同时采用了观察者模式用于通知主线程以更新图形化显示。按照QThread的用法,从QObject继承的对象调用moveToThread就可以使之存在于一个独立线程中,问题是被观察者调用notify函数时是间接调用了观察者的update,而被观察者于观察者有可能不在同一个线程中,这样直接调用会不会出问题呢?虽然程序运行看起来没啥问题,但还是觉得不放心,欢迎讨论!
...全文
474 4 打赏 收藏 转发到动态 举报
写回复
用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来进行跨线程调用

16,233

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧