diff options
Diffstat (limited to 'app/rendercoord.hpp')
-rw-r--r-- | app/rendercoord.hpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/app/rendercoord.hpp b/app/rendercoord.hpp index 113b4dc..a749f8a 100644 --- a/app/rendercoord.hpp +++ b/app/rendercoord.hpp @@ -2,6 +2,7 @@ #define RENDER_THREAD_H #include "draw.hpp" +#include <atomic> #include <qlabel.h> #include <render.hpp> @@ -16,10 +17,17 @@ class RenderThread : public QThread { Q_OBJECT public: - RenderThread(Renderer r, QObject *parent = nullptr, unsigned id = 0); + RenderThread(Renderer r, unsigned threads, QObject *parent = nullptr, unsigned id = 0); // Returns 0 if successful or 1 if busy int render(QRgb *buffer, unsigned samples); + + void pause(); + void resume(); + + unsigned stop(); + void stopAt(int at); + unsigned current_samples(); signals: @@ -31,18 +39,21 @@ class RenderThread : public QThread { QSemaphore m_lock; QRgb *m_writebuffer; - unsigned m_samples; - unsigned m_current_samples; + std::atomic_int m_samples; + std::atomic_int m_current_samples; Renderer m_render; + unsigned m_workers; + // Value in here means work is to be done QSemaphore m_work; + QSemaphore m_pause; unsigned m_id; }; -const std::string states[] = { "Stopped", "Running" }; -enum State { stopped, running }; +const std::string states[] = { "Stopped", "Running", "Stopping" }; +enum State { stopped, running, stopping }; class RenderCoordinator : public QObject { Q_OBJECT @@ -54,15 +65,19 @@ class RenderCoordinator : public QObject { public slots: void workerDone(unsigned workerid); + void stop(); private slots: void updateUi(); private: + unsigned calcStats(unsigned *max, unsigned *min, double *avg); + DrawWidget &m_target; Renderer m_renderer; - RenderThread m_worker; + std::vector<RenderThread*> m_workers; + unsigned m_started; QLabel *m_status; QTimer m_timer; |