[問題] [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