aboutsummaryrefslogtreecommitdiffstats
path: root/gui/fpgaviewwidget.h
diff options
context:
space:
mode:
authorSergiusz Bazanski <q3k@q3k.org>2018-07-20 10:58:30 +0100
committerSergiusz Bazanski <q3k@q3k.org>2018-07-20 10:58:30 +0100
commit0385ad1b1cc3dcd4673b3c674bc28ca12a7c7450 (patch)
treed5240f82ad875e2959a4d578bfb57021326f2447 /gui/fpgaviewwidget.h
parent03508faabfc2f5b76039cfd13d02a341baa848a4 (diff)
downloadnextpnr-0385ad1b1cc3dcd4673b3c674bc28ca12a7c7450.tar.gz
nextpnr-0385ad1b1cc3dcd4673b3c674bc28ca12a7c7450.tar.bz2
nextpnr-0385ad1b1cc3dcd4673b3c674bc28ca12a7c7450.zip
Refactor renderer thread
Diffstat (limited to 'gui/fpgaviewwidget.h')
-rw-r--r--gui/fpgaviewwidget.h60
1 files changed, 57 insertions, 3 deletions
diff --git a/gui/fpgaviewwidget.h b/gui/fpgaviewwidget.h
index 19440054..f846abca 100644
--- a/gui/fpgaviewwidget.h
+++ b/gui/fpgaviewwidget.h
@@ -28,6 +28,7 @@
#include <QOpenGLVertexArrayObject>
#include <QOpenGLWidget>
#include <QPainter>
+#include <QTimer>
#include <QThread>
#include <QWaitCondition>
@@ -209,6 +210,60 @@ class LineShader
void draw(const LineShaderData &data, const QColor &color, float thickness, const QMatrix4x4 &projection);
};
+class PeriodicRunner : public QThread
+{
+ Q_OBJECT
+private:
+ QMutex mutex_;
+ QWaitCondition condition_;
+ bool abort_;
+ std::function<void()> target_;
+ QTimer timer_;
+public:
+ explicit PeriodicRunner(QObject *parent, std::function<void()> target) :
+ QThread(parent), abort_(false), target_(target), timer_(this)
+ {
+ connect(&timer_, &QTimer::timeout, this, &PeriodicRunner::poke);
+ }
+
+ void run(void) override
+ {
+ for (;;) {
+ mutex_.lock();
+ condition_.wait(&mutex_);
+
+ if (abort_) {
+ mutex_.unlock();
+ return;
+ }
+
+ target_();
+
+ mutex_.unlock();
+ }
+ }
+
+ void startTimer(std::chrono::milliseconds value)
+ {
+ timer_.start(value);
+ }
+
+ ~PeriodicRunner()
+ {
+ mutex_.lock();
+ abort_ = true;
+ condition_.wakeOne();
+ mutex_.unlock();
+
+ wait();
+ }
+
+ void poke(void)
+ {
+ condition_.wakeOne();
+ }
+};
+
class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
@@ -245,7 +300,6 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
private:
void renderLines(void);
- void renderLinesWorker(void);
QPoint lastPos_;
LineShader lineShader_;
@@ -261,9 +315,9 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
const float zoomLvl2_ = 50.0f;
Context *ctx_;
+ QTimer paintTimer_;
- QWaitCondition render_;
- std::unique_ptr<QThread> renderThread_;
+ std::unique_ptr<PeriodicRunner> renderRunner_;
struct {
QColor background;