2017-04-03 211 views
0

我使用QP 5.7作爲QProgressBar的GUI應用程序。我懷疑可能會有內存泄漏,因爲內存使用量在運行時增加了大約50MB/s。我可以將問題縮小爲一行代碼。QProgressBar :: setValue(int)導致內存泄漏?

QProgressBar *pbarQuality; 
... 
int curQuality = data.getQuality(); 
if (curQuality < 0) { 
    curQuality = 0; 
    qWarning("Value set to 0. "); 
} 
if (curQuality > 100) { 
    curQuality = 100; 
    qWarning("Value set to 100. "); 
} 
ui.pbarQuality->setValue(curQuality); //The memory problem doesn't occur when this single line is commented out 

QProgressBar(pbarQuality)的值僅用於顯示。它不在別的地方使用。

我覺得這是一個非常奇怪的行爲。我錯過了什麼嗎?

下面是自動生成的代碼由Qt設計:

 pbarQuality = new QProgressBar(frame_5); 
     pbarQuality->setObjectName(QStringLiteral("pbarQuality")); 
     pbarQuality->setGeometry(QRect(10, 50, 130, 23)); 
     pbarQuality->setValue(24); 
+0

向我們展示如何獲得那個'* pbarquality'指針的值 – SingerOfTheFall

+0

使用valgrind來驗證Qt是否有錯誤,而不是您的代碼。它會告訴你確切的泄漏來自哪裏。 –

+0

@SingerOfTheFall我從來沒有設置或得到它。我使用Qt Designer來創建GUI。 – dcfyg

回答

0

我的應用程序除了定期(最多每秒60次)向GUI線程發送信息(圖像)的GUI線程外,還運行另一個線程。我正在GUI線程中做一些小的圖像編輯(調整大小)。事實證明,這需要很長的時間才能跟上另一個線程發佈的數據。因此事件隊列變得越來越大,所使用的RAM也變得越來越大。

獲得的經驗:如果定期發佈數據,請注意線程的處理速度。數據處理需要在新數據可用之前完成。

感謝@KubaOber給我提示。

+0

只是想知道你是怎麼想出來的 – chbchb55

+1

@ chbchb55我正在尋找導致所謂內存泄漏的代碼行。在逐步執行應用程序時,我在每個步驟後都採用了內存快照(在Visual Studio中),以確定內存中的點增加了。我註釋了不同的代碼行,直到泄漏不再發生(這是當我懷疑QProgressBar():: setValue()是問題時。當我注意到累計的RAM數量大約是圖像的大小並且我讀到發出的事件排隊等待處理,直到問題出現爲止。 – dcfyg

1

嘗試通過pbarQuality.update(); QCoreApplication::processEvents();更換setValue,看看是否能重現問題。如果是這樣,你可以利用嵌套的事件循環來保持圖形用戶界面的響應,同時阻塞代碼運行,這是一件壞事。 setValue呼叫processEvents作爲一種天真的方式來處理破碎的用戶代碼。恕我直言,這是一個危險的好處。唯一的解決方法就是解開代碼並將控制返回到主事件循環而不是阻塞。

This answer顯示瞭如何通過利用QImage的RAII行爲來避免圖像風暴的影響,並鏈接到另一個通過利用OpenGL演示自由圖像縮放的答案。