[英]Qt/C++ memory leak with QThread and QPainter::drawText()
我正在使用 Qt4.6,在 64 位 Linux 下编译的 32 位,并且有一个令人费解的 memory 问题,我无法弄清楚。 我有一个包含 QLabel 的 QWidget。 此 QLabel 用作每个重绘设置的绘画区域:
m_label->setPixmap(QPixmap::fromImage(image));
图像在小部件paintEvent 中更新:
void MemTest::paintEvent(QPaintEvent* pEvent)
{
// Wait for latest painting if not finished, then perform threaded repaint
m_plotThread->wait();
m_plotThread->start();
}
也就是说,绘制是使用 QThread 线程执行的,其中线程 function 如下所示:
void PlotThread::run()
{
// Lock the thread
m_mutex.lock();
// Image for painting
QImage image(400, 300, QImage::Format_ARGB32);
image.fill(0);
// Create painter on the image
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing, true);
QFont font("Helvetica", m_textSize);
painter.setFont(font);
painter.setPen(QColor(255,0,0));
painter.setBrush(QColor(130,150,255));
// Draw some shapes
painter.drawLine(0, 0, 400, 300);
painter.setPen(QColor(40,30,30));
painter.drawEllipse(15, 50, 130, 90);
// Draw the text
// !!! This causes memory leak !!!
painter.drawText(QPoint(40, 100), "What's my problem?");
m_mutex.unlock();
// Send painted image through signal
emit plotFinished(image);
}
一切都按预期工作,除了 drawText 导致严重的 memory 泄漏,在多次绘画后很容易检测到。 该问题仅在绘制完成线程并使用 drawText 时出现。 如果 drawText 被删除,或者如果它直接使用,而不是线程,在小部件paintEvent 中没有问题。 例如,使用 drawLine、drawRect、drawEllipse 等进行多线程绘制没有问题。
这种行为有解释吗? 以及drawText function如何在不引起泄漏的情况下多线程使用?
虽然大多数绘图操作都支持在非 GUI 线程中的QImage
上,但 X11 系统上有一个关于是否允许文本渲染的supportsThreadedFontRendering
:
http://doc.qt.nokia.com/4.7-snapshot/qfontdatabase.html#supportsThreadedFontRendering
我不确定您的系统上返回的标志是什么。 但即使它说“真的”,那么你的配置中可能有足够的黑魔法,它不会起作用。
有关 Qt 处理线程和绘制操作的细节的其他一些重要说明,请参见此处:
http://doc.qt.nokia.com/4.7-snapshot/threads-modules.html#painting-in-threads
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.