qt 线程更新UI界面
来源:互联网 发布:js添加节点 编辑:程序博客网 时间:2024/05/22 18:06
ui操作必须在主线程做的,分支线程只能发送消息给主线程进行引导操作
想在别的线程刷新UI,可以发送事件给UI线程,通知它更新。
或者在线程内的worker对象上定义一个信号,连接到Widget的update()上,然后你在合适的时候emit 你的信号即可。
在做QT编程的时候,有一点很重要的就是一个QT进程只能有一个UI线程,而且所有关于UI的操作只能在这个线程上进行。
一个例子,程序需要一个后台线程进行耗时操作,前台用一个Dialog显示进度,在Windows下面,可以让这个后台线程直接更改这个Dialog显示的进度,但在QT下,这样会产生无法预期的结果,正确的做法是让后台线程postEvent给UI线程,让UI线程去更新进度显示。
为什么QT有这样的限制而windows没有呢?
因为QT最初设计成可以可以编译成只支持单线程或者可以支持多线程,因为大多数工作一个线程就足够了。更关键的是,UI的操作最终是要操作于显存(或者系统内存),对于X系统而言,client和server的通讯需要socket,而这些都是资源,多个线程需要访问同一资源的时候,需要线程间同步。线程间同步是耗时的,QT设计之初不想消耗这样的效率,于是决定干脆只让一个线程做UI操作。Windows到底怎么让多个线程访问UI资源的,不大清楚细节,但是肯定要用进程间同步。QT发展到4.0beta,每个线程都可以有自己的event loop,但是还是保留了只有一个UI线程的设计。
实际上,只容许一个UI线程是一个好的系统设计,这样一方面提高了效率,另一方面也明显区分了worker和UI之间的逻辑。Java AWT一开始是多UI线程的设计,现在AWT逐渐被SWT取代,SWT采用的就是单UI线程的设计。不象SWT,QT并没有运行时强制检查当前线程,这样减少了冗余代码,但是也让一些在非UI线程上做UI操作的问题难以发现。
Qt 生产者消费者
定义一个QList链表,生产者不断地将数据添加到QList的队尾,消费者不断去询问QList是否为空,如为空则等待,否则就获取QList队头第一个数据。如此就是一个简单的生产者与消费者关系如果要完善一下,则需要添加一个信号量来管理QList的删除和添加操作,防止出现错误
- qt 线程更新UI界面
- android线程更新UI界面
- 子线程、ui界面更新
- 子线程中更新ui界面
- Android 子线程 更新 UI 界面 总结
- Android 子线程更新UI界面
- Android在子线程更新UI界面
- Qt子线程如何更新UI?
- Qt子线程更新UI的方法
- VS+QT开发,ui界面更新,.h未更新
- 使用Thread+Handler实现非UI线程更新UI界面
- 非UI线程更新UI界面的各种方法小结
- 使用Thread+Handler实现非UI线程更新UI界面
- 非UI线程更新UI界面的各种方法小结
- 使用Thread+Handler实现非UI线程更新UI界面
- 使用Thread+Handler实现非UI线程更新UI界面
- 使用Thread+Handler实现非UI线程更新UI界面
- Android非UI线程中更新UI界面
- LinkedHashMap
- 热编译工具fswatch
- Nginx+Tomcat+Memcached集群Session共享
- 大数据的显示
- Mac下vim插件taglist的一个小问题
- qt 线程更新UI界面
- LVS快速搭建教程
- 数据库安装时的log路径
- Error tips:array type has incomplete element type
- javascript判断身份证信息
- Spring Data Neo4j reference文档中关于@RelatedTo注解的注意事项
- spring注解详细介绍
- SurfaceFlinger -- FramebufferSurface 详解
- Apache Maven 入门篇(二)