gpt4 book ai didi

c++ - QThread 和 QPainter::drawText() 的 Qt/C++ 内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:00 29 4
gpt4 key购买 nike

我正在使用 Qt4.6,在 64 位 Linux 下编译的 32 位,并且有一个我无法弄清楚的令人费解的内存问题。我有一个包含 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线程执行的,其中线程函数如下所示:

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 导致严重的内存泄漏,多次绘制后很容易检测到。只有在绘画完成线程化并使用 drawText 时才会出现此问题。如果 drawText 被删除或者直接使用,而不是线程化,在 widgets paintEvent 中是没有问题的。例如,使用 drawLine、drawRect、drawEllipse 等进行多线程绘制时没有问题。

是否有对此行为的解释?以及如何在不导致泄漏的情况下多线程使用 drawText 函数?

最佳答案

虽然大多数绘图操作都支持在非 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

关于c++ - QThread 和 QPainter::drawText() 的 Qt/C++ 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012579/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com