deadlock issues, part 1
parent
7ec713347f
commit
04c0351d8a
|
@ -163,8 +163,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
|
|
||||||
connect(m_renderListener, SIGNAL(jobFinished(const RenderJob *, bool)),
|
connect(m_renderListener, SIGNAL(jobFinished(const RenderJob *, bool)),
|
||||||
this, SLOT(onJobFinished(const RenderJob *, bool)), Qt::QueuedConnection);
|
this, SLOT(onJobFinished(const RenderJob *, bool)), Qt::QueuedConnection);
|
||||||
connect(m_renderListener, SIGNAL(refresh(const RenderJob *, const Bitmap *)),
|
connect(m_renderListener, SIGNAL(refresh(const RenderJob *)),
|
||||||
this, SLOT(onRefresh(const RenderJob *, const Bitmap *)), Qt::BlockingQueuedConnection);
|
this, SLOT(onRefresh(const RenderJob *)), Qt::QueuedConnection);
|
||||||
connect(m_renderListener, SIGNAL(workEnd(const RenderJob *, const ImageBlock *)),
|
connect(m_renderListener, SIGNAL(workEnd(const RenderJob *, const ImageBlock *)),
|
||||||
this, SLOT(onWorkEnd(const RenderJob *, const ImageBlock *)), Qt::DirectConnection);
|
this, SLOT(onWorkEnd(const RenderJob *, const ImageBlock *)), Qt::DirectConnection);
|
||||||
connect(m_renderListener, SIGNAL(workBegin(const RenderJob *, const RectangularWorkUnit *, int)),
|
connect(m_renderListener, SIGNAL(workBegin(const RenderJob *, const RectangularWorkUnit *, int)),
|
||||||
|
@ -1673,10 +1673,11 @@ void MainWindow::onWorkEnd(const RenderJob *job, const ImageBlock *block) {
|
||||||
emit updateView();
|
emit updateView();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onRefresh(const RenderJob *job, const Bitmap *_bitmap) {
|
void MainWindow::onRefresh(const RenderJob *job) {
|
||||||
SceneContext *context = getContext(job, false);
|
SceneContext *context = getContext(job, false);
|
||||||
if (context == NULL)
|
if (context == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Film *film = context->scene->getFilm();
|
Film *film = context->scene->getFilm();
|
||||||
Point2i co = film->getCropOffset();
|
Point2i co = film->getCropOffset();
|
||||||
Bitmap *bitmap = context->framebuffer;
|
Bitmap *bitmap = context->framebuffer;
|
||||||
|
|
|
@ -41,6 +41,11 @@ class PreviewSettingsDlg;
|
||||||
class QRenderListener : public QObject, public RenderListener {
|
class QRenderListener : public QObject, public RenderListener {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
QRenderListener() {
|
||||||
|
m_mutex = new Mutex();
|
||||||
|
m_cond = new ConditionVariable(m_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
/// Called when work has begun in a rectangular image region
|
/// Called when work has begun in a rectangular image region
|
||||||
inline void workBeginEvent(const RenderJob *job, const RectangularWorkUnit *wu, int worker) {
|
inline void workBeginEvent(const RenderJob *job, const RectangularWorkUnit *wu, int worker) {
|
||||||
emit workBegin(job, wu, worker);
|
emit workBegin(job, wu, worker);
|
||||||
|
@ -53,7 +58,12 @@ public:
|
||||||
|
|
||||||
/// Called when the whole target image has been altered in some way
|
/// Called when the whole target image has been altered in some way
|
||||||
inline void refreshEvent(const RenderJob *job, const Bitmap *bitmap) {
|
inline void refreshEvent(const RenderJob *job, const Bitmap *bitmap) {
|
||||||
emit refresh(job, bitmap);
|
m_mutex->lock();
|
||||||
|
m_bitmap = bitmap;
|
||||||
|
emit refresh(job);
|
||||||
|
m_cond->wait(500);
|
||||||
|
m_bitmap = NULL;
|
||||||
|
m_mutex->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called when a render job has completed successfully or unsuccessfully
|
/// Called when a render job has completed successfully or unsuccessfully
|
||||||
|
@ -61,14 +71,29 @@ public:
|
||||||
emit jobFinished(job, cancelled);
|
emit jobFinished(job, cancelled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Lock the mutex
|
||||||
|
inline void lock() { m_mutex->lock(); }
|
||||||
|
|
||||||
|
/// Access the image associated with the last refresh event
|
||||||
|
inline const Bitmap *getBitmap() const { return m_bitmap.get(); }
|
||||||
|
|
||||||
|
/// Unlock the mutex
|
||||||
|
inline void unlock() { m_mutex->unlock(); }
|
||||||
|
|
||||||
MTS_DECLARE_CLASS()
|
MTS_DECLARE_CLASS()
|
||||||
signals:
|
signals:
|
||||||
void workBegin(const RenderJob *job, const RectangularWorkUnit *wu, int worker);
|
void workBegin(const RenderJob *job, const RectangularWorkUnit *wu, int worker);
|
||||||
void workEnd(const RenderJob *job, const ImageBlock *wr);
|
void workEnd(const RenderJob *job, const ImageBlock *wr);
|
||||||
void refresh(const RenderJob *job, const Bitmap *bitmap);
|
void refresh(const RenderJob *job);
|
||||||
void jobFinished(const RenderJob *job, bool cancelled);
|
void jobFinished(const RenderJob *job, bool cancelled);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~QRenderListener() { }
|
virtual ~QRenderListener() { }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ref<Mutex> m_mutex;
|
||||||
|
ref<ConditionVariable> m_cond;
|
||||||
|
ref<Bitmap> m_bitmap;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PreviewSettingsDialog;
|
class PreviewSettingsDialog;
|
||||||
|
|
Loading…
Reference in New Issue