From 7201d09c9aca90ec5afe92eed6fff51f9aebccba Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 15 Feb 2015 02:34:39 +0100 Subject: [PATCH] refs #380, changed to CWorker for aircraft mapper Removed QConcurrent --- samples/blacksim/samplesfscommon.cpp | 72 +++++++++--------------- src/blackgui/models/listmodelbase.cpp | 4 +- src/blacksim/fscommon/aircraftmapper.cpp | 42 ++++++-------- src/blacksim/fscommon/aircraftmapper.h | 16 ++---- 4 files changed, 49 insertions(+), 85 deletions(-) diff --git a/samples/blacksim/samplesfscommon.cpp b/samples/blacksim/samplesfscommon.cpp index c74cc8172..1bbb3b981 100644 --- a/samples/blacksim/samplesfscommon.cpp +++ b/samples/blacksim/samplesfscommon.cpp @@ -37,56 +37,36 @@ namespace BlackSimTest return 0; } - streamOut << "d .. direct, b .. background" << endl; + streamOut << "start reading" << endl; QString input = streamIn.readLine(); + Q_UNUSED(input); - if (!input.startsWith("b")) - { - streamOut << "reading directly" << endl; - QTime time; - time.start(); - streamOut << "reading " << mapper.getAircraftCfgEntriesList().getRootDirectory() << endl; - mapper.readSimObjects(); - streamOut << "read entries: " << mapper.getAircraftCfgEntriesList().size() << " in " << time.restart() << "ms" << endl; + streamOut << "reading directly" << endl; + QTime time; + time.start(); + streamOut << "reading " << mapper.getAircraftCfgEntriesList().getRootDirectory() << endl; + mapper.readSimObjects(); + streamOut << "read entries: " << mapper.getAircraftCfgEntriesList().size() << " in " << time.restart() << "ms" << endl; - CAircraftCfgEntriesList entriesList = mapper.getAircraftCfgEntriesList(); - QJsonDocument doc(entriesList.toJson()); - QByteArray jsonArray(doc.toJson()); - streamOut << "write JSON array with size " << jsonArray.size() << endl; - QTemporaryFile tempFile; - tempFile.open(); - tempFile.write(jsonArray); - tempFile.close(); - streamOut << "written to " << tempFile.fileName() << " in " << time.restart() << "ms" << endl; + CAircraftCfgEntriesList entriesList = mapper.getAircraftCfgEntriesList(); + QJsonDocument doc(entriesList.toJson()); + QByteArray jsonArray(doc.toJson()); + streamOut << "write JSON array with size " << jsonArray.size() << endl; + QTemporaryFile tempFile; + tempFile.open(); + tempFile.write(jsonArray); + tempFile.close(); + streamOut << "written to " << tempFile.fileName() << " in " << time.restart() << "ms" << endl; - // re-read - tempFile.open(); - jsonArray = tempFile.readAll(); - doc = QJsonDocument::fromJson(jsonArray); - entriesList.clear(); - entriesList.convertFromJson(doc.object()); - streamOut << "read JSON array with size " << jsonArray.size() << endl; - streamOut << "read entries from disk: " << entriesList.size() << " in " << time.restart() << "ms" << endl; - tempFile.close(); - } - else - { - streamOut << "reading in background" << endl; - QFuture f = mapper.readInBackground(); - int i = 0; - do - { - if (i % 20 == 0) - { - streamOut << "."; - streamOut.flush(); - } - QCoreApplication::processEvents(QEventLoop::AllEvents, 1000 * 5); - } - while (!f.isFinished()); - streamOut << endl << f.result() << " entries" << endl; - } - streamOut << "-----------------------------------------------" << endl; + // re-read + tempFile.open(); + jsonArray = tempFile.readAll(); + doc = QJsonDocument::fromJson(jsonArray); + entriesList.clear(); + entriesList.convertFromJson(doc.object()); + streamOut << "read JSON array with size " << jsonArray.size() << endl; + streamOut << "read entries from disk: " << entriesList.size() << " in " << time.restart() << "ms" << endl; + tempFile.close(); return 0; } diff --git a/src/blackgui/models/listmodelbase.cpp b/src/blackgui/models/listmodelbase.cpp index 19556bcb6..5bb2d527b 100644 --- a/src/blackgui/models/listmodelbase.cpp +++ b/src/blackgui/models/listmodelbase.cpp @@ -224,11 +224,11 @@ namespace BlackGui } template - BlackMisc::CWorker *CListModelBase::updateAsync(const ContainerType &container, bool sort) + CWorker *CListModelBase::updateAsync(const ContainerType &container, bool sort) { auto sortColumn = this->getSortColumn(); auto sortOrder = this->getSortOrder(); - BlackMisc::CWorker *worker = BlackMisc::CWorker::fromTask(this, "ModelSort", [this, container, sort, sortColumn, sortOrder]() + CWorker *worker = BlackMisc::CWorker::fromTask(this, "ModelSort", [this, container, sort, sortColumn, sortOrder]() { ContainerType sortedContainer = this->sortContainerByColumn(container, sortColumn, sortOrder); QMetaObject::invokeMethod(this, "ps_updateContainer", diff --git a/src/blacksim/fscommon/aircraftmapper.cpp b/src/blacksim/fscommon/aircraftmapper.cpp index d126bf1aa..5d1fb2532 100644 --- a/src/blacksim/fscommon/aircraftmapper.cpp +++ b/src/blacksim/fscommon/aircraftmapper.cpp @@ -9,6 +9,7 @@ #include "aircraftmapper.h" #include "blackmisc/logmessage.h" +#include "blackmisc/worker.h" #include using namespace BlackMisc; @@ -45,27 +46,13 @@ namespace BlackSim return n; } - QFuture &CAircraftMapper::readInBackground(const QString &simObjectDir) + void CAircraftMapper::initCompletelyInBackground(const QString &simObjectDir) { - if (!isRunningInBackground()) + if (this->m_initWorker) { return; } + this->m_initWorker = BlackMisc::CWorker::fromTask(this, "CAircraftMapper::initCompletely", [this, simObjectDir]() { - this->m_backgroundRead = QtConcurrent::run(this, &CAircraftMapper::readSimObjects, simObjectDir); - } - return this->m_backgroundRead; - } - - QFuture &CAircraftMapper::initCompletelyInBackground(const QString &simObjectDir) - { - if (!isRunningInBackground()) - { - this->m_backgroundInit = QtConcurrent::run(this, &CAircraftMapper::initCompletely, simObjectDir); - } - return this->m_backgroundInit; - } - - bool CAircraftMapper::isRunningInBackground() const - { - return this->m_backgroundInit.isRunning() || this->m_backgroundRead.isRunning(); + this->initCompletely(simObjectDir); + }); } bool CAircraftMapper::isInitialized() const @@ -106,13 +93,9 @@ namespace BlackSim void CAircraftMapper::gracefulShutdown() { // when running, force re-init - if (isRunningInBackground()) - { - m_init = false; - this->m_entries.cancelRead(); - this->m_backgroundInit.cancel(); - this->m_backgroundRead.cancel(); - } + this->m_entries.cancelRead(); + this->m_initInProgress = false; + this->m_init = false; } const CAircraftModel &CAircraftMapper::getDefaultModel() @@ -129,10 +112,13 @@ namespace BlackSim bool CAircraftMapper::initCompletely(QString simObjectDir) { if (this->m_init) { return true; } + if (this->m_initInProgress) { return false; } + this->m_initInProgress = true; if (!this->m_mappings) { CLogMessage(this).error("Missing mapping defintions"); emit initCompleted(false); + this->m_initInProgress = false; return false; } @@ -140,6 +126,7 @@ namespace BlackSim { CLogMessage(this).error("Mapping engine, cannot read Flight Simulator directory: %1") << simObjectDir; emit initCompleted(false); + this->m_initInProgress = false; return false; } @@ -153,6 +140,7 @@ namespace BlackSim { CLogMessage(this).error("Reading mapping rules failed or empty"); emit initCompleted(false); + this->m_initInProgress = false; return false; } } @@ -167,6 +155,7 @@ namespace BlackSim { CLogMessage(this).error("No SimObjects found in %1") << simObjectDir; emit initCompleted(false); + this->m_initInProgress = false; return false; } } @@ -180,6 +169,7 @@ namespace BlackSim // finish CLogMessage(this).info("Mapping system: %1 definitions for %2 entries") << this->m_mappings->size() << this->m_entries.size(); emit initCompleted(true); + this->m_initInProgress = false; this->m_init = true; return true; } diff --git a/src/blacksim/fscommon/aircraftmapper.h b/src/blacksim/fscommon/aircraftmapper.h index 06051eba3..71ebcc11d 100644 --- a/src/blacksim/fscommon/aircraftmapper.h +++ b/src/blacksim/fscommon/aircraftmapper.h @@ -14,6 +14,7 @@ #include "aircraftcfgentrieslist.h" #include "../simulatormodelmappings.h" +#include "blackmisc/worker.h" #include #include #include @@ -61,14 +62,8 @@ namespace BlackSim //! Read for directory or re-read int readSimObjects(const QString &simObjectDir = ""); - //! Read in background - QFuture &readInBackground(const QString &simObjectDir = ""); - //! Init in background - QFuture &initCompletelyInBackground(const QString &simObjectDir = ""); - - //! Running in background - bool isRunningInBackground() const; + void initCompletelyInBackground(const QString &simObjectDir = ""); //! Init completed? bool isInitialized() const; @@ -110,10 +105,9 @@ namespace BlackSim private: QScopedPointer m_mappings; //!< all mapping definitions CAircraftCfgEntriesList m_entries; //!< all entries - QFuture m_backgroundInit; - QFuture m_backgroundRead; - bool m_init = false; - + bool m_init = false; + bool m_initInProgress = false; + BlackMisc::CWorker *m_initWorker = nullptr; }; } // namespace } // namespace