Я пытаюсь обновить изображение из потока. Как видите, я использую мьютексы для защиты 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);
}