最開(kāi)始使用Qt時(shí)就遇到過(guò)QT Gui失去響應(yīng)的問(wèn)題,我是用多線程的方式解決的,然而通常來(lái)說(shuō),多線程是會(huì)降低程序的運(yùn)行速度。
之后,在使用QSqlQuery::execBatch()函數(shù)時(shí),Qt Gui 又失去響應(yīng),雖然多線程可以解決,但是如果能用單線程很好解決的,最好不要用到多線程,因?yàn)槎嗑€程不僅容易拖慢程序的速度,編程及維護(hù)的難度也更大,能用簡(jiǎn)單方法解決的,就不要用復(fù)雜的方法。
于是我再次搜索資料,期望在解決方案的選擇與解決步驟上,能夠得到一個(gè)全面而又細(xì)致的總結(jié)。
Witold Wysota 的文章https://doc.qt.io/archives/qq/qq27-responsive-guis.html#performinglongoperations 總結(jié)的非常不錯(cuò)。
Jason Lee的翻譯: http://blog.csdn.net/jasonblog/article/details/5568589
所以本文是在此文基礎(chǔ)上的部分翻譯、理解與二次總結(jié)??傊袆h減,有補(bǔ)充,所以沒(méi)寫(xiě) '轉(zhuǎn)' 字。
一、問(wèn)題的來(lái)源與分析
首先,我們要知道 “為什么Qt Gui 會(huì)停止響應(yīng)?”。簡(jiǎn)明扼要的說(shuō)就是:長(zhǎng)時(shí)間的密集處理或等待阻塞了Qt的事件循環(huán),應(yīng)用程序不能響應(yīng)來(lái)自窗口系統(tǒng)的事件請(qǐng)求(《C++ Gui Qt4》 P135中有描述)。 那么多長(zhǎng)算長(zhǎng)呢?一秒鐘算長(zhǎng),兩秒鐘太長(zhǎng)。
其次,“ 何種情形下會(huì)發(fā)生該問(wèn)題? ”??煞譃閮煞N情形: