This repository has been archived by the owner on Jun 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
renderthread.h
116 lines (93 loc) · 3.4 KB
/
renderthread.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
** Copyright (c) 2011 Andrea Cisternino
**
** This file is part of QtFractal.
**
** QtFractal is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published
** by the Free Software Foundation, version 2.
**
** QtFractal is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with QtFractal. If not, see <http://www.gnu.org/licenses/>.
*/
/*!
* \file renderthread.h
* \brief Header file defining the RenderThread class
* \author Andrea Cisternino
*/
#ifndef RENDERTHREAD_H
#define RENDERTHREAD_H
#include <QMutex>
#include <QSize>
#include <QThread>
#include <QWaitCondition>
class QImage;
// ---- RenderThread ------------------------------------------------------
/*!
* \brief Class responsible for rendering fractals in the background.
*/
class RenderThread : public QThread
{
Q_OBJECT
QMutex mutex; //!< Used to protect all shared data members from concurrent access
QWaitCondition condition; //!< Condition variable used to synchronize thread execution
QSize imageSize; //!< The size of the image to create
// shared variables
bool restart; //!< Set when the main thread needs to restart the rendering thread
bool abort; //!< Set when the main thread needs to stop the rendering thread
public:
// ---- Lifecycle -----------------------------------------------------
/*!
* \brief Constructs a new RenderThread. The thread does not begin executing
* until start() is called.
*/
RenderThread(QObject *parent = 0);
/*!
* \brief Terminates all running instances of RenderThread.
*
* Remember, this is executed by the controlling thread (the GUI thread.)
* Its responsibility is that of terminating the child threads by using the
* shared variables.
*/
~RenderThread();
// ---- Public API ----------------------------------------------------
/*!
* \brief Main entry point for the rendering action.
*
* Communicates with the continuosly running thread (the run() function)
* using shared variables.
*
* \param[in] size the size of the image to render.
*/
void render(QSize size);
// ---- Signals -------------------------------------------------------
signals:
/*!
* \brief Signal emitted when the image is ready.
* \param[in] image the rendered image
*/
void renderedImage(const QImage &image);
// ---- Thread code --------------------------------------------------
protected:
/*!
* \brief Main thread code; overridden from QThread.
*
* This is the only code that is actually run in his own thread and
* is started by the invocation of the start() method.
*/
void run();
private:
// ---- Render fractal -----------------------------------------------
/*!
* \brief Renders the image of a complete Mandelbrot set in the given image.
* \param image the QImage to render the image to.
* \return the number of milliseconds used to generate the image.
*/
qint64 mandelbrot(const QImage &image);
};
#endif // RENDERTHREAD_H