From 99f2d40b535c124ebdd39099ca2f3db8a48f88a0 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 3 Jul 2018 13:58:35 +0200 Subject: [PATCH] Remove progress indicators for individual threads. --- xs/src/slic3r/AppController.cpp | 68 ++++++++++----------------------- xs/src/slic3r/AppController.hpp | 35 ++++------------- 2 files changed, 28 insertions(+), 75 deletions(-) diff --git a/xs/src/slic3r/AppController.cpp b/xs/src/slic3r/AppController.cpp index cd35077af..151b7f880 100644 --- a/xs/src/slic3r/AppController.cpp +++ b/xs/src/slic3r/AppController.cpp @@ -18,26 +18,24 @@ namespace Slic3r { -class AppControllerBoilerplate::PriMap { +class AppControllerBoilerplate::PriData { public: - using M = std::unordered_map; std::mutex m; - M store; std::thread::id ui_thread; - inline explicit PriMap(std::thread::id uit): ui_thread(uit) {} + inline explicit PriData(std::thread::id uit): ui_thread(uit) {} }; AppControllerBoilerplate::AppControllerBoilerplate() - :progressind_(new PriMap(std::this_thread::get_id())) {} + :pri_data_(new PriData(std::this_thread::get_id())) {} AppControllerBoilerplate::~AppControllerBoilerplate() { - progressind_.reset(); + pri_data_.reset(); } bool AppControllerBoilerplate::is_main_thread() const { - return progressind_->ui_thread == std::this_thread::get_id(); + return pri_data_->ui_thread == std::this_thread::get_id(); } namespace GUI { @@ -53,50 +51,25 @@ static const PrintStep STEP_SKIRT = psSkirt; static const PrintStep STEP_BRIM = psBrim; static const PrintStep STEP_WIPE_TOWER = psWipeTower; -void AppControllerBoilerplate::progress_indicator( - AppControllerBoilerplate::ProgresIndicatorPtr progrind) { - progressind_->m.lock(); - progressind_->store[std::this_thread::get_id()] = progrind; - progressind_->m.unlock(); -} - -void AppControllerBoilerplate::progress_indicator(unsigned statenum, - const string &title, - const string &firstmsg) -{ - progressind_->m.lock(); - progressind_->store[std::this_thread::get_id()] = - create_progress_indicator(statenum, title, firstmsg); - progressind_->m.unlock(); -} - -void AppControllerBoilerplate::progress_indicator(unsigned statenum, - const string &title) -{ - progressind_->m.lock(); - progressind_->store[std::this_thread::get_id()] = - create_progress_indicator(statenum, title); - progressind_->m.unlock(); -} - AppControllerBoilerplate::ProgresIndicatorPtr -AppControllerBoilerplate::progress_indicator() { - - PriMap::M::iterator pret; +AppControllerBoilerplate::global_progress_indicator() { ProgresIndicatorPtr ret; - progressind_->m.lock(); - if( (pret = progressind_->store.find(std::this_thread::get_id())) - == progressind_->store.end()) - { - progressind_->store[std::this_thread::get_id()] = ret = - global_progressind_; - } else ret = pret->second; - progressind_->m.unlock(); + pri_data_->m.lock(); + ret = global_progressind_; + pri_data_->m.unlock(); return ret; } +void AppControllerBoilerplate::global_progress_indicator( + AppControllerBoilerplate::ProgresIndicatorPtr gpri) +{ + pri_data_->m.lock(); + global_progressind_ = gpri; + pri_data_->m.unlock(); +} + void PrintController::make_skirt() { assert(print_ != nullptr); @@ -195,8 +168,6 @@ void PrintController::make_perimeters(PrintObject *pobj) slice(pobj); - auto&& prgind = progress_indicator(); - if (!pobj->state.is_done(STEP_PERIMETERS)) { pobj->_make_perimeters(); } @@ -279,7 +250,8 @@ void PrintController::slice(AppControllerBoilerplate::ProgresIndicatorPtr pri) void PrintController::slice() { - auto pri = progress_indicator(); + auto pri = global_progress_indicator(); + if(!pri) pri = create_progress_indicator(100, L("Slicing")); slice(pri); } @@ -324,7 +296,7 @@ void AppController::arrange_model() unsigned count = 0; for(auto obj : model_->objects) count += obj->instances.size(); - auto pind = progress_indicator(); + auto pind = global_progress_indicator(); float pmax = 1.0; diff --git a/xs/src/slic3r/AppController.hpp b/xs/src/slic3r/AppController.hpp index cece771cc..e9252b50c 100644 --- a/xs/src/slic3r/AppController.hpp +++ b/xs/src/slic3r/AppController.hpp @@ -30,16 +30,16 @@ class PrintConfig; * a cli client. */ class AppControllerBoilerplate { - class PriMap; // Some structure to store progress indication data public: /// A Progress indicator object smart pointer using ProgresIndicatorPtr = std::shared_ptr; private: + class PriData; // Some structure to store progress indication data // Pimpl data for thread safe progress indication features - std::unique_ptr progressind_; + std::unique_ptr pri_data_; public: @@ -102,32 +102,14 @@ public: const string& description); /** - * @brief Set up a progress indicator for the current thread. - * @param progrind An already created progress indicator object. + * @brief Return the global progress indicator for the current controller. + * Can be empty as well. + * + * Only one thread should use the global indicator at a time. */ - void progress_indicator(ProgresIndicatorPtr progrind); + ProgresIndicatorPtr global_progress_indicator(); - /** - * @brief Create and set up a new progress indicator for the current thread. - * @param statenum The number of states for the given procedure. - * @param title The title of the procedure. - * @param firstmsg The message for the first subtask to be displayed. - */ - void progress_indicator(unsigned statenum, - const string& title, - const string& firstmsg); - - void progress_indicator(unsigned statenum, - const string& title); - - /** - * @brief Return the progress indicator set up for the current thread. This - * can be empty as well. - * @return A progress indicator object implementing IProgressIndicator. If - * a global progress indicator is available for the current implementation - * than this will be set up for the current thread and returned. - */ - ProgresIndicatorPtr progress_indicator(); + void global_progress_indicator(ProgresIndicatorPtr gpri); /** * @brief A predicate telling the caller whether it is the thread that @@ -258,7 +240,6 @@ public: */ void set_print(Print *print) { printctl = PrintController::create(print); - printctl->progress_indicator(progress_indicator()); } /**