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的删除和添加操作,防止出现错误


0 0
原创粉丝点击