作者liu2007 (薯)
看板C_and_CPP
标题[问题] [QT] 为什麽GUI卡住了...
时间Sun Jan 23 01:46:58 2022
我的开发平台是 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的更新呢?
想请问为什麽会这样呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.225.144 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1642873620.A.BB9.html
1F:推 ko27tye: 你connect的type有改QueuedConnection吗 01/23 10:12
2F:→ liu2007: 有的 01/23 10:53
3F:推 ko27tye: 没code不好判断 你的状况很像所有GUI的变化卡在某个 01/23 13:39
4F:→ ko27tye: function内 return後才一次动作 01/23 13:40
5F:推 john790710: 接个eventFilter看一下有哪个卡住 01/25 12:44
6F:推 James7878978: 试试 qApp->processEvents(); 01/26 10:55
7F:推 jin879: 没code不好判断,但请不要在非gui thread操作widget,设 02/14 08:28
8F:→ jin879: 值之类的 02/14 08:28
9F:→ jin879: 要也是将解压的资料转成pixmap後再送回gui做个别label显 02/14 08:29
10F:→ jin879: 示 02/14 08:29