簡體   English   中英

Qt中線程之間共享的像素圖

[英]Pixmap shared between threads in Qt

我有一個主要的 GUI 類和另一個 Worker 類:第一個處理 GUI 的事情(將QPixmap繪制到QGraphicsScene ),第二個處理計算的事情(將QLineQPoint繪制到QPixmap )。 這兩個類在兩個不同的線程中運行。 當我創建Worker線程時,我將 GUI 的QPixmap的地址傳遞給Worker類,因此它們共享相同的對象。

QPixmapWorker類中修改,在GUI類中繪制。 即使我沒有任何問題,我還是決定使用QMutex來確保我的程序在繪制時不會嘗試訪問QPixmap 現在,為了做到這一點,我在 GUI 類和Worker類之間共享了一個QMutexWorker類再次有一個指向 GUI 的QMutex的指針)。 每當我閱讀或修改QPixmap我都會鎖定QMutex

這是一種有效的方法嗎? 到目前為止,我從未出錯,但我想知道它在邏輯上是否正確,以及 Qt 是否提供了更好的方法來實現這一點。

先感謝您。

根據Qt5 線程安全頁面

QPainter 可以在線程中用於在 QImage、QPrinter 和 QPicture 繪制設備上進行繪制。 不支持在 QPixmaps 和 QWidgets 上繪畫。

所以官方的說法是不,你不應該在主線程之外修改 QPixmap。 您可能“很幸運”,因為它恰好在您當前的用例下在您當前的平台上工作,但 Qt 不保證它會工作。

一種更安全的方法可能是讓您的工作線程繪制到 QImage 對象中,然后當 GUI 線程想要更​​新 GUI 時,它可以抓取並繪制最新版本的 QImage 對象(使用互斥鎖或其他一些機制來制作確保工作線程不會同時更新 QImage)。

我同意根據文檔,不允許在工作線程中使用 QPixmap。 但是,根據代碼。

構造函數檢查它是否在主線程中。 如果它不在主線程中,它會檢查名為 ThreadedPixmap 的功能。 如果啟用,它將繼續沒有問題。 據我所知,所有平台都支持 ThreadedPixmap,因此似乎可以在其他線程上使用 QPixmap。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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