我的开发平台是 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的更新呢?
想请问为什么会这样呢?