qt为什么只能在主线程里进行UI操作?

IT人Key 2012-07-30 07:35:07
好几位大神告诉我qt只能在主线程new一个ui和进行一些ui相关的操作
我不懂为什么,期待大神解答?
...全文
2806 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
nlstone 2012-08-13
  • 打赏
  • 举报
回复
对Qt而言,一个进程里和窗口系统(譬如Win32的GDI, linux下的X11)UI事件关联的只有主UI线程,而并没有设计成多线程和系统窗口系统同时交互(复杂性,安全性,性能等原因),这应该是根源。
sno_guo 2012-08-12
  • 打赏
  • 举报
回复
呵呵,近来利用业余时间学习了下android ,感觉android中的ui界面也是这样的,只能在主线程中实现的,别的线程无法进行,呵呵,具体的原因我也在关注中。。。。
中才德创 2012-08-02
  • 打赏
  • 举报
回复
子线程,一般处理数据用的。
  • 打赏
  • 举报
回复
深入浅出MFC P559LZ可以看看 将的很详细
奔跑哥 2012-08-02
  • 打赏
  • 举报
回复
一般都是只能在主线程里操作UI。android UI 框架也是这样。
主线程只有一个,在他里面操作会安全。如果子线程都可以修改UI,那么这样有会潜在的线程直接的访问错误,操作错误。
tempofdownload 2012-08-02
  • 打赏
  • 举报
回复
多线程同时对UI操作,基本上都不行吧,
在QT线程中new个UI表示该UI所属线程是new的那个,需要改变UI的线程所属后才能和其他UI使用事件循环,处理什么的。
念茜 2012-08-02
  • 打赏
  • 举报
回复
如果你愿意,推荐给你一篇文章:http://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html
念茜 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 1 楼 的回复:
系统图形系统的限制
每个UI库都有这样的限制
但是我在线程里面new一个widget是可以正常显示的啊?我同事告诉我说是因为在主线程里面运行的app->exec(),所以这样次线程里面的ui无法接受到系统事件,是不是这样的原因啊?
[/Quote]

的确是这样。主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()。exec()启动了事件循环,一直在等待接收并且处理一个个Qt封装好的事件,比如鼠标移动事件,键盘按下事件等等。所以只有在主线程里你才可以方便利用各种Event去完成自己想要实现的需求。所以就限制你必须在主线程作UI相关操作。
除了规定,往根源说,再多的线程,实质上对于CPU来说,也是一件一件的处理,并不是我们凭空现象的同时处理。只是可以“智能”的处理一下当前迫切需要的数据,然后可以随时暂停,再去处理更加迫切的。如果2个线程同时处理UI显示,一个线程正在用于和用户交互更新显示,另外一个线程就只能是等待状态,并不能完成我们所期望的同时刷新UI的期望。
所以,基本上大部分应用开发框架都限制更新、创建UI必须在主线程里完成,而逻辑运算可以匹出新线程去完成。

多线程,越方便越快捷也就越容易隐藏bug,多线程间数据同步很容易搞乱,互斥量、读写锁、信号、共享等等。想要多线程同步处理UI更新,你也要给伟大的框架开发程序员们一些时间呵呵……
wshn13 2012-08-02
  • 打赏
  • 举报
回复
不是所有图形库都不能在线程操作界面的……
zhu_xz 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

但是我在线程里面new一个widget是可以正常显示的啊?我同事告诉我说是因为在主线程里面运行的app->exec(),所以这样次线程里面的ui无法接受到系统事件,是不是这样的原因啊?
[/Quote]
这是一个原因
IT人Key 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
系统图形系统的限制
每个UI库都有这样的限制
[/Quote]但是我在线程里面new一个widget是可以正常显示的啊?我同事告诉我说是因为在主线程里面运行的app->exec(),所以这样次线程里面的ui无法接受到系统事件,是不是这样的原因啊?
IT人Key 2012-08-01
  • 打赏
  • 举报
回复
还有呢?能详细讲讲吗?大哥[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

但是我在线程里面new一个widget是可以正常显示的啊?我同事告诉我说是因为在主线程里面运行的app->exec(),所以这样次线程里面的ui无法接受到系统事件,是不是这样的原因啊?

这是一个原因
[/Quote]
SilenceSu 2012-07-31
  • 打赏
  • 举报
回复
学习了

Quote=引用 1 楼 的回复:]

系统图形系统的限制
每个UI库都有这样的限制
[/Quote]
刀刀亮 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

系统图形系统的限制
每个UI库都有这样的限制
[/Quote]
第一次听说,学习了
zhu_xz 2012-07-30
  • 打赏
  • 举报
回复
系统图形系统的限制
每个UI库都有这样的限制
课程摘要1 Qt音视频开发实战 是陈超老师用10年以上音视频一线实战开发经验,四年音视频开发教学经验打造的Qt音视频开发课程。2 Qt音视频开发实战以Qt c++开发为中心。所有课程全部围绕Qt音视频开发展开。3 非常适合那些只做Qt开发的工程师来学习,学习更容易一些。学习目标,培养高级Qt音视频开发工程师.4 Qt音视频开发实战适合那些掌握Qt基础开发,初级开发工程师,月薪在20k以下,通过学习,达到更高薪水的Qt高级开发工程师。 课程优势1 老师过去15年+ 音视频,网络通讯,数字图像处理一线实战经验。过去四年积累了丰富的音视频开发教学经验,学员从年薪30w~50w,就职于腾讯,阿等各大互联网公司。2 老师10多年Qt开发经验,长期大量使用Qt开发项目,国内最早一批使用Qt的程序员。3 QQ 一对一教学指导,阶段性作业案例小项目指导,就业面试指导。 课程内容1 Qt 核心基础加强。对于那些学了很多年Qt开发而不得要领的学员非常友好。2 音视频开发基础。音视频原理,RGB YUV, 音频原理。图像压缩编码,音频压缩编码,H.264压缩,H.264编码原理 I P B SPS PPS解析,   视频存储容器,mp4 , AAC.  Qt音频视频采集,FFmpeg编码,解码,x264编码,AAC编码。mp3编码。格式转换。视频播放器内核。图像渲染。3 OpenGL数字图像处理基础。OpenGL基础,渲染管线,shader编程。滤镜,美颜,后期处理。编写渲染引擎。4 网络socket通讯编程,自定义私有协议。TCP/UDP音视频传输。 学员要求1 熟悉c/c++,掌握Qt基本控件,类基础。2 每天学习两小时,学习周期3~5个月,做完练习,小项目。

16,216

社区成员

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

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