From 075077b4e18f829094acce26dd36e7b3e5a8757b Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 12 Jul 2012 09:50:42 +0200 Subject: [PATCH] Enhance interface of AbstractTaskProgress * Rename handleTaskProgress() to taskProgressEvent() * Add task control features (asyncStop() + taskStopEvent()) --- src/abstract_task_progress.cpp | 21 +++++++++++++++---- src/abstract_task_progress.h | 8 ++++++-- src/libstl/stlb.cpp | 37 ++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/abstract_task_progress.cpp b/src/abstract_task_progress.cpp index bf02f6b..c177eec 100644 --- a/src/abstract_task_progress.cpp +++ b/src/abstract_task_progress.cpp @@ -16,7 +16,8 @@ public: m_rangeMin(-1.), m_rangeMax(-2.), m_rangeLength(0.), - m_progressThreshold(0.01) // Notifies each percent only + m_progressThreshold(0.01), // Notifies each percent only + m_isTaskStopRequested(false) { } @@ -26,6 +27,7 @@ public: double m_rangeMax; double m_rangeLength; double m_progressThreshold; + bool m_isTaskStopRequested; }; } // namespace internal @@ -82,7 +84,7 @@ void AbstractTaskProgress::setValue(double v) { if (std::fabs(v - d->m_value) > std::fabs(d->m_progressThreshold * d->m_rangeLength)) { d->m_value = v; - this->handleProgressUpdate(); + this->progressUpdateEvent(); } } @@ -96,9 +98,19 @@ void AbstractTaskProgress::setProgressUpdateThreshold(double v) d->m_progressThreshold = v; } -bool AbstractTaskProgress::isStopRequested() const +void AbstractTaskProgress::asyncTaskStop() { - return false; + d->m_isTaskStopRequested = true; +} + +bool AbstractTaskProgress::isTaskStopRequested() const +{ + return d->m_isTaskStopRequested; +} + +void AbstractTaskProgress::taskStoppedEvent() +{ + d->m_isTaskStopRequested = false; } void AbstractTaskProgress::reset() @@ -107,6 +119,7 @@ void AbstractTaskProgress::reset() d->m_value = -1.; d->m_rangeMin = -1.; d->m_rangeMax = -2.; + d->m_isTaskStopRequested = false; } } // namespace foug diff --git a/src/abstract_task_progress.h b/src/abstract_task_progress.h index 1066920..b5dac1a 100644 --- a/src/abstract_task_progress.h +++ b/src/abstract_task_progress.h @@ -25,10 +25,14 @@ public: double progressUpdateThreshold() const; void setProgressUpdateThreshold(double v); - virtual bool isStopRequested() const; - virtual void handleProgressUpdate() = 0; virtual void reset(); + void asyncTaskStop(); + bool isTaskStopRequested() const; + virtual void taskStoppedEvent(); + + virtual void progressUpdateEvent() = 0; + private: internal::AbstractTaskProgressPrivate* const d; }; diff --git a/src/libstl/stlb.cpp b/src/libstl/stlb.cpp index 5e7695f..56f2c70 100644 --- a/src/libstl/stlb.cpp +++ b/src/libstl/stlb.cpp @@ -90,6 +90,9 @@ bool Io::read(AbstractGeometryBuilder* builder) // const int facetCount = (fileSize - stlHeaderSize - stlFacetCountSize) / stlFacetSize; + if (this->stream() == 0) + return false; + AbstractStream* istream = this->stream(); AbstractTaskProgress* progress = this->taskProgress(); const UInt32 chunkSize = stlTriangleDataSize * 163; @@ -153,25 +156,36 @@ bool Io::read(AbstractGeometryBuilder* builder) builder->processNextTriangle(triangle, attributeByteCount); bufferOffset += stlTriangleDataSize; - } + } // end for - if (progress != 0) - progress->setValue(amountReadSize / stlTriangleDataSize); + if (progress != 0) { + if (progress->isTaskStopRequested()) { + streamError = true; + progress->taskStoppedEvent(); + } + else { + progress->setValue(amountReadSize / stlTriangleDataSize); + } + } amountReadSize += iReadSize; } else { streamError = true; } - } + } // end while - builder->endTriangles(); + if (!streamError) + builder->endTriangles(); return !streamError; } bool Io::write(const stl::AbstractGeometry& geom, const AbstractGeometryExtraData* extraData) { + if (this->stream() == 0) + return false; + AbstractStream* ostream = this->stream(); AbstractTaskProgress* progress = this->taskProgress(); @@ -232,9 +246,16 @@ bool Io::write(const stl::AbstractGeometry& geom, const AbstractGeometryExtraDat != stlTriangleDataSize) return false; - if (progress != 0) - progress->setValue(facet + 1); - } + if (progress != 0) { + if (progress->isTaskStopRequested()) { + progress->taskStoppedEvent(); + return false; + } + else { + progress->setValue(facet + 1); + } + } + } // end for return true; }