• 7347阅读
  • 4回复

关于能否使用进程或多线程实现GUI的问题 [复制链接]

上一主题 下一主题
离线lbblscy
 

只看楼主 倒序阅读 楼主  发表于: 2009-07-18
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
最近做了一个小项目,需要集成多个ActiveX (Web Browser)控件,每个Web Browser控件使用QAxWidget封装,每个QAxWidget都属于同一个QTabWidget,方便切换。
发现当多个Web Browser同时加载页面或处理复杂JS时,整个界面都会卡住,简单分析了一下:应该是所有的处理都在同一个线程(主线程)中,导致事件循环被阻塞造成的。
自己尝试使用多线程来控制GUI,发现只要是非主线程对GUI进行更新等操作,程序就会报错;于是想到Google Chrome的多进程架构——关键是如何让不同的进程可以处理同一个窗体或控件?网上搜到一个老外在Linux下面用Webkit、D-Bus和XEmbed实现了process-per-tab browser

另外,从Google Chromium的官网得知,现在的多线程架构仍然不能充分利用多核处理器的优势,同一进程的所有线程还是只能排队在某个核心上运行。

请教大家有没有这方面的经验?如何在Windows下实现多进程、多线程的GUI的控制(绘制)?谢谢!
离线lbblscy

只看该作者 1楼 发表于: 2009-07-18
难道论坛里没有人尝试过多线程吗?
离线rqzrqh

只看该作者 2楼 发表于: 2009-07-18
好高深
离线hercules

只看该作者 3楼 发表于: 2009-07-18
在你的线程中处理数据,在需要更新的时候emit一个signal到你的主线程,由你的主线程对UI更新,这样就可以了。

如果在线程中更新UI,虽然有可能可以,但是比较容易出问题,因此建议UI的操作应该都在主线程中处理.
我的QQ号:337396132
欢迎大家加我为好友,一起学习Qt
离线lbblscy

只看该作者 4楼 发表于: 2009-07-18
因为Web Browser控件在执行Js函数时非常消耗资源,所以才考虑能不能把Web Browser放到子线程中运行,这样主线程就不会被阻塞了。
现在封装Web Browser的QAxWidget是在主线程中创建的,能不能在子线程中创建?

引用第3楼hercules于2009-07-18 23:18发表的  :
在你的线程中处理数据,在需要更新的时候emit一个signal到你的主线程,由你的主线程对UI更新,这样就可以了。
如果在线程中更新UI,虽然有可能可以,但是比较容易出问题,因此建议UI的操作应该都在主线程中处理.
快速回复
限100 字节
 
上一个 下一个