看板 C_and_CPP 關於我們 聯絡資訊
我的開發平台是 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://www.ptt.cc/bbs/C_and_CPP/M.1642873620.A.BB9.html
ko27tye: 你connect的type有改QueuedConnection嗎 01/23 10:12
liu2007: 有的 01/23 10:53
ko27tye: 沒code不好判斷 你的狀況很像所有GUI的變化卡在某個 01/23 13:39
ko27tye: function內 return後才一次動作 01/23 13:40
john790710: 接個eventFilter看一下有哪個卡住 01/25 12:44
James7878978: 試試 qApp->processEvents(); 01/26 10:55
jin879: 沒code不好判斷,但請不要在非gui thread操作widget,設 02/14 08:28
jin879: 值之類的 02/14 08:28
jin879: 要也是將解壓的資料轉成pixmap後再送回gui做個別label顯 02/14 08:29
jin879: 示 02/14 08:29