31 #include <QFutureWatcher>
33 #include <QtConcurrentRun>
34 #include <QtConcurrentMap>
57 m_mappedRunning =
false;
59 m_progressBar =
new ProgressBar(
"Reading Control Nets");
64 connect(
m_watcher, SIGNAL(finished()),
this, SLOT(mappedFinished()));
86 ProgressBar *ConcurrentControlNetReader::progressBar() {
96 m_backlog.append(filename);
98 if (!m_progressBar.isNull()) {
99 m_progressBar->setRange(0, m_progressBar->maximum() + 1);
111 m_backlog.append(filenames);
113 if (!m_progressBar.isNull()) {
114 m_progressBar->setRange(0, m_progressBar->maximum() + filenames.size());
129 void ConcurrentControlNetReader::initProgress() {
131 m_progressBar->setVisible(
false);
132 m_progressBar->setRange(0, 100);
133 m_progressBar->setValue(0);
138 void ConcurrentControlNetReader::start() {
140 if (!m_backlog.isEmpty() && !m_mappedRunning) {
143 foreach (QString backlogFileName, m_backlog) {
144 Progress *progress =
new Progress;
145 progress->DisableAutomaticDisplay();
146 m_progress.append(progress);
148 functorInput.append(qMakePair(FileName(backlogFileName), progress));
151 QFuture<Control *> networks = QtConcurrent::mapped(functorInput,
152 FileNameToControlFunctor(QThread::currentThread()));
154 Control * control = networks.result();
155 ControlNet * cnet = control->controlNet();
156 if (!cnet->IsValid()) {
160 if (!m_progressBar.isNull()) {
161 m_progressBar->setVisible(
true);
164 delete m_progressUpdateTimer;
167 m_mappedRunning =
true;
170 m_progressUpdateTimer =
new QTimer;
171 connect(m_progressUpdateTimer, SIGNAL(timeout()),
172 this, SLOT(updateProgressValue()));
173 m_progressUpdateTimer->start(100);
178 void ConcurrentControlNetReader::updateProgressValue() {
179 if (!m_mappedRunning) {
180 foreach (Progress *progress, m_progress) {
188 int progressMax = (m_progress.count() + m_backlog.count()) * 1000;
189 int progressCurrent = 0;
191 foreach (Progress *progress, m_progress) {
192 if (progress->MaximumSteps()) {
193 if (progress->CurrentStep() < progress->MaximumSteps()) {
194 double progressPercent = progress->CurrentStep() / (double)progress->MaximumSteps();
196 progressCurrent += qFloor(progressPercent * 1000);
199 progressCurrent += 1000;
205 if (progressMax > 0) {
206 m_progressBar->setRange(progressMin, progressMax);
207 m_progressBar->setValue(progressCurrent);
210 m_progressBar->setRange(0, 100);
211 m_progressBar->setValue(100);
217 void ConcurrentControlNetReader::mappedFinished() {
218 m_mappedRunning =
false;
220 delete m_progressUpdateTimer;
221 updateProgressValue();
224 emit networksReady(networks);
226 if (!m_backlog.isEmpty()) {
235 ConcurrentControlNetReader::FileNameToControlFunctor::FileNameToControlFunctor(
237 m_targetThread = targetThread;
241 ConcurrentControlNetReader::FileNameToControlFunctor::FileNameToControlFunctor(
242 const FileNameToControlFunctor & other) {
243 m_targetThread = other.m_targetThread;
247 ConcurrentControlNetReader::FileNameToControlFunctor::~FileNameToControlFunctor() {
248 m_targetThread = NULL;
252 Control * ConcurrentControlNetReader::FileNameToControlFunctor::operator()(
255 QString fileNameString = fileNameAndProgress.first.expanded();
256 Progress *progress = fileNameAndProgress.second;
258 ControlNet *newCnet =
new ControlNet(fileNameString, progress);
259 Control *result =
new Control(newCnet, fileNameString);
261 newCnet->setParent(result);
262 result->moveToThread(m_targetThread);
268 ConcurrentControlNetReader::FileNameToControlFunctor &
269 ConcurrentControlNetReader::FileNameToControlFunctor::operator=(
270 const FileNameToControlFunctor &rhs) {
271 m_targetThread = rhs.m_targetThread;
void nullify()
Initializes members to NULL.
QFutureWatcher< Control * > * m_watcher
provides SIGNALS / SLOTS for FileNameToControlFunctor
ConcurrentControlNetReader()
Allocates memory at construction instead of as needed.
~ConcurrentControlNetReader()
This destructor will cancel all running threads and block.
void read(QString filename)
QProgressBar with customizable text.