簡體   English   中英

Qt/C++ memory 泄漏與 QThread 和 QPainter::drawText()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM