谈谈多线程 UI和逻辑的控制

hlx_beat 2014-12-02 10:51:18
最近的一个项目使用Duilib库,经常发现界面上有控件丢失,刚开始以为是界面层次太多导致后来发现不是,又开始怀疑是UI库的问题,因为这个库本身就不是很稳定,后来同事说试试把UI层的操作全给主线控制,底层线程不要控制UI 就这样解决问题了。。
...全文
338 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-12-04
  • 打赏
  • 举报
回复
引用 4 楼 hlx_beat 的回复:
[quote=引用 3 楼 sinservice 的回复:] UI当然都是单线程,连silerlight、wpf都是。 搞多线程UI,那是滥用线程。
当时就是这样设计的:为了尽量减少UI的处理,比如说UI层响应某个事件我设置回调给底层,让底层处理好全部事物并及时回调到UI层更新UI,当时想到在回调中处理UI就很方便了,没有必要再发消息让主线程去处理并且感觉会是系统变得更复杂,现在才深刻体会UI处理必须是由创建他的线程去处理[/quote] UI线程里当然不应做耗时的操作,但处理所有窗口和控件的消息,都应该在一个线程里做。 像silverlight和wpf,如果你调用UI控件的线程不是UI线程,就会抛异常,叫 跨线程操作异常。 在mfc实现的窗口机制里,跨线程操作会导致断言失败。 很可惜,貌似android的java的ui没有对跨线程访问进行判断。
赵4老师 2014-12-04
  • 打赏
  • 举报
回复
线程A要求UI立即清屏,同时线程B要求UI立即显示文字“Oh!My God!”。 楼主你觉得屏幕到底应该显示啥捏?
hlx_beat 2014-12-03
  • 打赏
  • 举报
回复
引用 3 楼 sinservice 的回复:
UI当然都是单线程,连silerlight、wpf都是。 搞多线程UI,那是滥用线程。
当时就是这样设计的:为了尽量减少UI的处理,比如说UI层响应某个事件我设置回调给底层,让底层处理好全部事物并及时回调到UI层更新UI,当时想到在回调中处理UI就很方便了,没有必要再发消息让主线程去处理并且感觉会是系统变得更复杂,现在才深刻体会UI处理必须是由创建他的线程去处理
ultra_sonic 2014-12-03
  • 打赏
  • 举报
回复
很多UI库操作UI都不是线程安全的(不知道Duilib是不是也是这种情况),所以只在主线程控制UI以及相关的事件响应是个比较好的做法(有些库内部就通过事件机制把UI控件操作都同步到主线程做,比如MFC很多控件接口里面都是SendMessage做的)。
「已注销」 2014-12-03
  • 打赏
  • 举报
回复
UI当然都是单线程,连silerlight、wpf都是。 搞多线程UI,那是滥用线程。
赵4老师 2014-12-03
  • 打赏
  • 举报
回复
查MSDN是Windows程序员必须掌握的技能之一。 Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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