From 7c0dd25e9f78639e1e2ad5f9d2369ce2457dd830 Mon Sep 17 00:00:00 2001 From: Walter Van Herck <w.van.herck@fz-juelich.de> Date: Mon, 18 Jun 2018 11:59:17 +0200 Subject: [PATCH] Move progress handler to IComputationTerms needing it --- Core/Computation/DelayedProgressCounter.cpp | 10 ++++++++-- Core/Computation/DelayedProgressCounter.h | 5 +++-- Core/Computation/GISASSpecularComputationTerm.h | 2 ++ Core/Computation/IComputationTerm.cpp | 6 ------ Core/Computation/IComputationTerm.h | 3 +-- Core/Computation/ParticleLayoutComputation.cpp | 10 ++++++++-- Core/Computation/ParticleLayoutComputation.h | 4 ++++ Core/Computation/RoughMultiLayerComputation.cpp | 8 ++++++-- Core/Computation/RoughMultiLayerComputation.h | 4 ++++ 9 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Core/Computation/DelayedProgressCounter.cpp b/Core/Computation/DelayedProgressCounter.cpp index 9c2de575e19..93c5e59fa80 100644 --- a/Core/Computation/DelayedProgressCounter.cpp +++ b/Core/Computation/DelayedProgressCounter.cpp @@ -15,11 +15,17 @@ #include "ProgressHandler.h" #include "DelayedProgressCounter.h" -void DelayedProgressCounter::stepProgress(ProgressHandler* progress) +DelayedProgressCounter::DelayedProgressCounter(ProgressHandler* p_progress, size_t interval) + : mp_progress(p_progress) + , m_interval(interval) + , m_count(0) +{} + +void DelayedProgressCounter::stepProgress() { ++m_count; if( m_count==m_interval ) { - progress->incrementDone(m_interval); + mp_progress->incrementDone(m_interval); m_count = 0; } } diff --git a/Core/Computation/DelayedProgressCounter.h b/Core/Computation/DelayedProgressCounter.h index 0f551178b48..bf3d7f2df36 100644 --- a/Core/Computation/DelayedProgressCounter.h +++ b/Core/Computation/DelayedProgressCounter.h @@ -24,12 +24,13 @@ class ProgressHandler; class DelayedProgressCounter { public: - DelayedProgressCounter(size_t interval) : m_interval(interval), m_count(0) {} + DelayedProgressCounter(ProgressHandler* p_progress, size_t interval); ~DelayedProgressCounter() {} //! Increments inner counter; at regular intervals updates progress handler. - void stepProgress(ProgressHandler* progress); + void stepProgress(); private: + ProgressHandler* mp_progress; const size_t m_interval; size_t m_count; }; diff --git a/Core/Computation/GISASSpecularComputationTerm.h b/Core/Computation/GISASSpecularComputationTerm.h index 2ebaeb20f1a..2c385ec3ea5 100644 --- a/Core/Computation/GISASSpecularComputationTerm.h +++ b/Core/Computation/GISASSpecularComputationTerm.h @@ -25,6 +25,8 @@ class GISASSpecularComputationTerm final : public IComputationTerm public: GISASSpecularComputationTerm(const MultiLayer* p_multi_layer, const IFresnelMap* p_fresnel_map); + void setProgressHandler(ProgressHandler*) override {} + void eval(ProgressHandler* progress, const std::vector<SimulationElement>::iterator& begin_it, const std::vector<SimulationElement>::iterator& end_it) const override; diff --git a/Core/Computation/IComputationTerm.cpp b/Core/Computation/IComputationTerm.cpp index abca4d95afe..c5282962d9e 100644 --- a/Core/Computation/IComputationTerm.cpp +++ b/Core/Computation/IComputationTerm.cpp @@ -19,17 +19,11 @@ IComputationTerm::IComputationTerm(const MultiLayer* p_multilayer, const IFresnelMap* p_fresnel_map) : mp_multilayer(p_multilayer) , mp_fresnel_map(p_fresnel_map) - , mp_progress(nullptr) {} IComputationTerm::~IComputationTerm() {} -void IComputationTerm::setProgressHandler(ProgressHandler* p_progress) -{ - mp_progress = p_progress; -} - void IComputationTerm::mergeRegionMap( std::map<size_t, std::vector<HomogeneousRegion> >& region_map) const { diff --git a/Core/Computation/IComputationTerm.h b/Core/Computation/IComputationTerm.h index b9a70101660..cb7479d9243 100644 --- a/Core/Computation/IComputationTerm.h +++ b/Core/Computation/IComputationTerm.h @@ -36,7 +36,7 @@ public: IComputationTerm(const MultiLayer* p_multilayer, const IFresnelMap* p_fresnel_map); virtual ~IComputationTerm(); - void setProgressHandler(ProgressHandler* p_progress); + virtual void setProgressHandler(ProgressHandler* p_progress) =0; //! Calculate scattering intensity for each SimulationElement //! returns false if nothing needed to be calculated @@ -51,7 +51,6 @@ protected: const MultiLayer* mp_multilayer; const IFresnelMap* mp_fresnel_map; std::map<size_t, std::vector<HomogeneousRegion>> m_region_map; - ProgressHandler* mp_progress; }; #endif // ICOMPUTATIONTERM_H diff --git a/Core/Computation/ParticleLayoutComputation.cpp b/Core/Computation/ParticleLayoutComputation.cpp index b5fab7eaabc..2967678b8d9 100644 --- a/Core/Computation/ParticleLayoutComputation.cpp +++ b/Core/Computation/ParticleLayoutComputation.cpp @@ -35,12 +35,16 @@ ParticleLayoutComputation::ParticleLayoutComputation( m_surface_density = p_layout->totalParticleSurfaceDensity(); } +void ParticleLayoutComputation::setProgressHandler(ProgressHandler* p_progress) +{ + mP_progress_counter.reset(new DelayedProgressCounter(p_progress, 100)); +} + //! Computes scattering intensity for given range of simulation elements. void ParticleLayoutComputation::eval(ProgressHandler* progress, const std::vector<SimulationElement>::iterator& begin_it, const std::vector<SimulationElement>::iterator& end_it) const { - DelayedProgressCounter counter(100); for (std::vector<SimulationElement>::iterator it = begin_it; it != end_it; ++it) { if (!progress->alive()) return; @@ -51,6 +55,8 @@ void ParticleLayoutComputation::eval(ProgressHandler* progress, } else { it->addIntensity(mP_strategy->evaluate(*it) * m_surface_density); } - counter.stepProgress(progress); + if (mP_progress_counter) { + mP_progress_counter->stepProgress(); + } } } diff --git a/Core/Computation/ParticleLayoutComputation.h b/Core/Computation/ParticleLayoutComputation.h index 4a71d89ccba..e33f326251e 100644 --- a/Core/Computation/ParticleLayoutComputation.h +++ b/Core/Computation/ParticleLayoutComputation.h @@ -20,6 +20,7 @@ using std::size_t; +class DelayedProgressCounter; class ILayout; class IInterferenceFunctionStrategy; @@ -34,6 +35,8 @@ public: const MultiLayer* p_multilayer, const IFresnelMap* p_fresnel_map, const ILayout* p_layout, size_t layer_index, const SimulationOptions& options, bool polarized); + void setProgressHandler(ProgressHandler* p_progress) override; + void eval(ProgressHandler* progress, const std::vector<SimulationElement>::iterator& begin_it, const std::vector<SimulationElement>::iterator& end_it) const override; @@ -41,6 +44,7 @@ public: private: std::unique_ptr<const IInterferenceFunctionStrategy> mP_strategy; double m_surface_density; + std::unique_ptr<DelayedProgressCounter> mP_progress_counter; }; #endif // PARTICLELAYOUTCOMPUTATION_H diff --git a/Core/Computation/RoughMultiLayerComputation.cpp b/Core/Computation/RoughMultiLayerComputation.cpp index 8dac2bbd710..53ed64d310b 100644 --- a/Core/Computation/RoughMultiLayerComputation.cpp +++ b/Core/Computation/RoughMultiLayerComputation.cpp @@ -44,6 +44,11 @@ RoughMultiLayerComputation::RoughMultiLayerComputation(const MultiLayer *p_multi : IComputationTerm(p_multi_layer, p_fresnel_map) {} +void RoughMultiLayerComputation::setProgressHandler(ProgressHandler* p_progress) +{ + mP_progress_counter.reset(new DelayedProgressCounter(p_progress, 100)); +} + void RoughMultiLayerComputation::eval(ProgressHandler* progress, const std::vector<SimulationElement>::iterator& begin_it, const std::vector<SimulationElement>::iterator& end_it) const @@ -51,12 +56,11 @@ void RoughMultiLayerComputation::eval(ProgressHandler* progress, if (mp_multilayer->requiresMatrixRTCoefficients()) { return; } - DelayedProgressCounter counter(100); for (std::vector<SimulationElement>::iterator it = begin_it; it != end_it; ++it) { if (!progress->alive()) return; it->addIntensity(evaluate(*it)); - counter.stepProgress(progress); + mP_progress_counter->stepProgress(); } } diff --git a/Core/Computation/RoughMultiLayerComputation.h b/Core/Computation/RoughMultiLayerComputation.h index 92bfd930a61..2ea9914ece6 100644 --- a/Core/Computation/RoughMultiLayerComputation.h +++ b/Core/Computation/RoughMultiLayerComputation.h @@ -19,6 +19,7 @@ #include "IComputationTerm.h" #include <vector> +class DelayedProgressCounter; class ProgressHandler; class SimulationElement; @@ -32,6 +33,8 @@ public: RoughMultiLayerComputation(const MultiLayer* p_multi_layer, const IFresnelMap* p_fresnel_map); + void setProgressHandler(ProgressHandler* p_progress) override; + void eval(ProgressHandler* progress, const std::vector<SimulationElement>::iterator& begin_it, const std::vector<SimulationElement>::iterator& end_it) const override; @@ -40,6 +43,7 @@ private: double evaluate(const SimulationElement& sim_element) const; complex_t get_refractive_term(size_t ilayer, double wavelength) const; complex_t get_sum8terms(size_t ilayer, const SimulationElement& sim_element) const; + std::unique_ptr<DelayedProgressCounter> mP_progress_counter; }; #endif // ROUGHMULTILAYERCOMPUTATION_H -- GitLab