我使用Qt 5.7作为带有QProgressBar的GUI应用程序。我怀疑可能存在内存泄漏,因为在运行时内存使用量增加约50MB / s。我可以将问题缩小到一行代码。
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 Designer自动生成的代码:
pbarQuality = new QProgressBar(frame_5);
pbarQuality->setObjectName(QStringLiteral("pbarQuality"));
pbarQuality->setGeometry(QRect(10, 50, 130, 23));
pbarQuality->setValue(24);
答案 0 :(得分:1)
尝试将setValue
替换为pbarQuality.update(); QCoreApplication::processEvents();
,看看是否能够重现问题。如果确实如此,那么您将利用嵌套的事件循环来保持GUI响应,同时阻止代码运行,这是一件坏事。 setValue
调用processEvents
作为解决破坏的用户代码的天真方式。恕我直言,这是一个危险的好处。唯一的解决方法是破坏你的代码并将控制权返回给主事件循环而不是阻塞。
This answer展示了如何通过利用QImage
的RAII行为来避免图像风暴的影响,并链接到另一个通过利用OpenGL演示免费图像缩放的答案。
答案 1 :(得分:0)
我的应用程序运行除GUI线程之外的另一个线程,它定期(每秒最多60次)将信息(图像)发送到GUI线程。我正在GUI线程中进行一些小的图像编辑(调整大小)。事实证明这需要太长时间才能跟上另一个线程发布的数据。因此,事件队列变得越来越大,使用的RAM也越来越大。
获得的经验:如果定期发布数据,请注意线程的处理速度。在新数据可用之前,需要进行数据处理。
感谢@KubaOber给我提示。