[问题] [QT] 为什么GUI卡住了...

楼主: liu2007 (è–¯)   2022-01-23 01:46:58
我的开发平台是 win7
工具是QT Creator
版本是Qt Core 5.15.2
我有一个视窗,里面有许多label,用来显示图片。
https://imgur.com/4T9CQHB
每个label对应不同的压缩档,除了解压缩读取图片之外,同时还要做其他管理的事情。
所以我写了一个Manager的QObject,并且moveToThread。
(有使用crrentThreadID确定GUI和manager处在不同的Thread)
https://imgur.com/ViP3xl0
每个label读图片的流程是:
1.GUI生成label,加入MainWidget里。
2.emit signal(label* ) 给 manager。
3.manager,生成runnable,把runnable和送过来的label connect起来
以便runnable解压缩结束之后送rawData给label,建立pixmap来显示图片。
4.呼叫QThreadPool::globalInstance()->start(runnable);
https://imgur.com/HPWmmkI
本来以为GUI会先显示空白的label框框
然后各自以不同的速度显示图片。
但是结果却是GUI并没有马上处理runnable工作结束送来的rawData
反而是等所有解完压缩的runnable的signal送过来之后才一并更新label的显示图片。
其实最后这段开始处里所有工作结束的signal的速度也很快,
GUI卡住的部分其实是送来的signal没有马上处理
而是一直累积等到最后一个signal抵达之后才一口气处理。
明明把工作都确认挪到不同的thread去了
为什么还是会阻塞GUI的更新呢?
想请问为什么会这样呢?
作者: ko27tye (好滋好滋)   2022-01-23 10:12:00
你connect的type有改QueuedConnection吗
楼主: liu2007 (è–¯)   2022-01-23 10:53:00
有的
作者: ko27tye (好滋好滋)   2022-01-23 13:39:00
没code不好判断 你的状况很像所有GUI的变化卡在某个function内 return后才一次动作
作者: john790710 (虎)   2022-01-25 12:44:00
接个eventFilter看一下有哪个卡住
作者: James7878978 (日夏)   2022-01-26 10:55:00
试试 qApp->processEvents();
作者: jin879 (-_-)   2022-02-14 08:28:00
没code不好判断,但请不要在非gui thread操作widget,设值之类的要也是将解压的资料转成pixmap后再送回gui做个别label显示

Links booklink

Contact Us: admin [ a t ] ucptt.com