Является ли QPainter :: drawImage блокирующим вызовом? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь обновить изображение из потока. Как видите, я использую мьютексы для защиты std::shared_ptr<QImage> от перезаписи. Однако он не будет работать, если вызов

painter->drawImage(this->boundingRect(), *qImage);

работает асинхронно. Я получаю segfault rigth в момент painter->drawImage, однако, если я запускаю отладчик, я не получаю его, возможно, потому что он слишком медленный, поэтому есть время для записи изображения на экран, прежде чем оно будет перезаписано.

Вот CameraView.h

#ifndef CAMERA_VIEW_H
#define CAMERA_VIEW_H
#include <QObject>
#include <QQuickPaintedItem>
#include <QImage>
#include <QPainter>
#include <memory>
#include <mutex>
class CameraView : public QQuickPaintedItem
{
    Q_OBJECT
    Q_DISABLE_COPY(CameraView)

public:
    CameraView(QQuickItem* parent = nullptr) {

    }
    void updateImage(std::shared_ptr<QImage> qImage);
public slots:
    void paint(QPainter *painter) override;

protected:
    std::shared_ptr<QImage> qImage;
    std::mutex qImageMutex;
};

#endif //CAMERA_VIEW_H


#include "CameraView.h"

Вот CameraView. cpp

//called by worker thread
void CameraView::updateImage(std::shared_ptr<QImage> qImage)
{
    std::unique_lock<std::mutex> lk{qImageMutex};
    this->qImage= qImage;
}
//called by update() (I guess). and update() is called from the main thread through QMetaObject::invokeMethod, so it runs on the main thread 
void CameraView::paint(QPainter* painter)
{
    std::unique_lock<std::mutex> lk{qImageMutex};
    painter->drawImage(this->boundingRect(), *qImage);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...