refs #522, consolidate mutable / make mutable thread safe

* removed mutable wherever possible in GUI classes
* in vPilotReader also renamed some functions and some minor improvements
This commit is contained in:
Klaus Basan
2015-11-25 23:06:14 +01:00
parent 2ee3934cc2
commit a2b413c8e1
15 changed files with 60 additions and 62 deletions

View File

@@ -186,7 +186,7 @@ namespace BlackGui
void CDbMappingComponent::ps_loadVPilotData()
{
if (this->m_vPilotReader.readASync(true))
if (this->m_vPilotReader.readInBackground(true))
{
CLogMessage(this).info("Start loading vPilot rulesets");
this->ui->tvp_AircraftModelsForVPilot->showLoadIndicator();

View File

@@ -42,7 +42,6 @@ namespace BlackGui
void CAircraftIcaoForm::setValue(const BlackMisc::Aviation::CAircraftIcaoCode &icao)
{
this->m_aircraft = icao;
this->ui->le_Id->setText(icao.getDbKeyAsString());
this->ui->aircraft_Selector->setAircraftIcao(icao);
this->ui->le_Manufacturer->setText(icao.getManufacturer());
@@ -61,13 +60,9 @@ namespace BlackGui
this->ui->le_Updated->setText(icao.getFormattedUtcTimestampYmdhms());
}
const CAircraftIcaoCode &CAircraftIcaoForm::getValue() const
CAircraftIcaoCode CAircraftIcaoForm::getValue() const
{
CAircraftIcaoCode icao(this->ui->aircraft_Selector->getAircraftIcao());
if (icao.hasCompleteData())
{
m_aircraft = icao;
}
QString manufacturer(this->ui->le_Manufacturer->text().trimmed().toUpper());
QString modelDescription(this->ui->le_ModelDescription->text());
QString wtc(ui->cb_Wtc->currentText().left(1));
@@ -78,13 +73,13 @@ namespace BlackGui
bool legacy = this->ui->cb_Legacy->isChecked();
bool military = this->ui->cb_Military->isChecked();
bool realWorld = this->ui->cb_RealWorld->isChecked();
m_aircraft.setManufacturer(manufacturer);
m_aircraft.setModelDescription(modelDescription);
m_aircraft.setWtc(wtc);
m_aircraft.setCodeFlags(military, legacy, realWorld);
m_aircraft.setRank(rank);
m_aircraft.setCombinedType(combined);
return m_aircraft;
icao.setManufacturer(manufacturer);
icao.setModelDescription(modelDescription);
icao.setWtc(wtc);
icao.setCodeFlags(military, legacy, realWorld);
icao.setRank(rank);
icao.setCombinedType(combined);
return icao;
}
CStatusMessageList CAircraftIcaoForm::validate() const

View File

@@ -41,7 +41,7 @@ namespace BlackGui
~CAircraftIcaoForm();
//! Get value
const BlackMisc::Aviation::CAircraftIcaoCode &getValue() const;
BlackMisc::Aviation::CAircraftIcaoCode getValue() const;
//! Validate, empty list means OK
BlackMisc::CStatusMessageList validate() const;
@@ -74,7 +74,6 @@ namespace BlackGui
private:
QScopedPointer<Ui::CAircraftIcaoForm> ui;
mutable BlackMisc::Aviation::CAircraftIcaoCode m_aircraft;
};
} // ns

View File

@@ -44,7 +44,7 @@ namespace BlackGui
void CAirlineIcaoForm::setValue(const BlackMisc::Aviation::CAirlineIcaoCode &icao)
{
this->m_airline = icao;
this->m_originalCode = icao;
this->ui->airline_Selector->setAirlineIcao(icao);
this->ui->le_Id->setText(icao.getDbKeyAsString());
this->ui->le_TelephonyDesignator->setText(icao.getTelephonyDesignator());
@@ -55,13 +55,14 @@ namespace BlackGui
this->ui->lbl_AirlineIcon->setPixmap(icao.toPixmap());
}
const CAirlineIcaoCode &CAirlineIcaoForm::getValue() const
CAirlineIcaoCode CAirlineIcaoForm::getValue() const
{
m_airline.setVirtualAirline(this->ui->cb_Va->isChecked());
m_airline.setCountry(this->ui->country_Selector->getCountry());
m_airline.setName(this->ui->le_Name->text());
m_airline.setTelephonyDesignator(this->ui->le_TelephonyDesignator->text());
return m_airline;
CAirlineIcaoCode code(m_originalCode);
code.setVirtualAirline(this->ui->cb_Va->isChecked());
code.setCountry(this->ui->country_Selector->getCountry());
code.setName(this->ui->le_Name->text());
code.setTelephonyDesignator(this->ui->le_TelephonyDesignator->text());
return code;
}
CStatusMessageList CAirlineIcaoForm::validate() const

View File

@@ -44,7 +44,7 @@ namespace BlackGui
void setValue(const BlackMisc::Aviation::CAirlineIcaoCode &icao = BlackMisc::Aviation::CAirlineIcaoCode());
//! Get value
const BlackMisc::Aviation::CAirlineIcaoCode &getValue() const;
BlackMisc::Aviation::CAirlineIcaoCode getValue() const;
//! Validate, empty list means OK
BlackMisc::CStatusMessageList validate() const;
@@ -69,8 +69,8 @@ namespace BlackGui
void ps_droppedCode(const BlackMisc::CVariant &variantDropped);
private:
QScopedPointer<Ui::CAirlineIcaoForm> ui;
mutable BlackMisc::Aviation::CAirlineIcaoCode m_airline; // object allowing to override values
QScopedPointer<Ui::CAirlineIcaoForm> ui;
BlackMisc::Aviation::CAirlineIcaoCode m_originalCode; //!< object allowing to override values
};
} // ns

View File

@@ -42,7 +42,6 @@ namespace BlackGui
void CDistributorForm::setValue(const BlackMisc::Simulation::CDistributor &distributor)
{
this->m_distributor = distributor;
this->ui->distributor_Selector->setDistributor(distributor);
this->ui->le_Description->setText(distributor.getDescription());
this->ui->le_Alias1->setText(distributor.getAlias1());
@@ -50,15 +49,13 @@ namespace BlackGui
this->ui->le_Updated->setText(distributor.getFormattedUtcTimestampYmdhms());
}
const CDistributor &CDistributorForm::getValue() const
CDistributor CDistributorForm::getValue() const
{
CDistributor d(ui->distributor_Selector->getDistributor());
if (d.hasCompleteData()) { this->m_distributor = d;}
m_distributor.setAlias1(this->ui->le_Alias1->text());
m_distributor.setAlias2(this->ui->le_Alias2->text());
m_distributor.setDescription(this->ui->le_Description->text());
return m_distributor;
CDistributor distributor(ui->distributor_Selector->getDistributor());
distributor.setAlias1(this->ui->le_Alias1->text());
distributor.setAlias2(this->ui->le_Alias2->text());
distributor.setDescription(this->ui->le_Description->text());
return distributor;
}
CStatusMessageList CDistributorForm::validate() const

View File

@@ -41,7 +41,7 @@ namespace BlackGui
~CDistributorForm();
//! Get value
const BlackMisc::Simulation::CDistributor &getValue() const;
BlackMisc::Simulation::CDistributor getValue() const;
//! Validate, empty list means OK
BlackMisc::CStatusMessageList validate() const;
@@ -74,7 +74,6 @@ namespace BlackGui
private:
QScopedPointer<Ui::CDistributorForm> ui;
mutable BlackMisc::Simulation::CDistributor m_distributor; // object allowing to override values
bool m_readOnly = false;
};

View File

@@ -41,18 +41,19 @@ namespace BlackGui
this->ui->editor_AirlineIcao->setProvider(provider);
}
const CLivery &CLiveryForm::getValue() const
CLivery CLiveryForm::getValue() const
{
CLivery livery(this->m_originalLivery);
CAirlineIcaoCode airline(this->ui->editor_AirlineIcao->getValue());
this->m_livery.setCombinedCode(this->ui->le_Code->text());
this->m_livery.setAirlineIcaoCode(airline);
this->m_livery.setDescription(this->ui->le_Description->text());
return m_livery;
livery.setAirlineIcaoCode(airline);
livery.setCombinedCode(this->ui->le_Code->text());
livery.setDescription(this->ui->le_Description->text());
return livery;
}
void CLiveryForm::setValue(const CLivery &livery)
{
this->m_livery = livery;
this->m_originalLivery = livery;
this->ui->le_Id->setText(livery.getDbKeyAsString());
this->ui->le_Code->setText(livery.getCombinedCode());
this->ui->le_Description->setText(livery.getDescription());

View File

@@ -43,7 +43,7 @@ namespace BlackGui
virtual void setProvider(BlackMisc::Network::IWebDataServicesProvider *provider) override;
//! Value
const BlackMisc::Aviation::CLivery &getValue() const;
BlackMisc::Aviation::CLivery getValue() const;
//! Value
void setValue(const BlackMisc::Aviation::CLivery &livery);
@@ -72,7 +72,7 @@ namespace BlackGui
private:
QScopedPointer<Ui::CLiveryForm> ui;
mutable BlackMisc::Aviation::CLivery m_livery; //!< object whose values will be overridden
BlackMisc::Aviation::CLivery m_originalLivery; //!< object whose values will be overridden
};
} // ns

View File

@@ -31,13 +31,14 @@ namespace BlackGui
CModelMappingForm::~CModelMappingForm()
{ }
const BlackMisc::Simulation::CAircraftModel &CModelMappingForm::getValue() const
BlackMisc::Simulation::CAircraftModel CModelMappingForm::getValue() const
{
m_model.setSimulatorInfo(this->ui->selector_Simulator->getValue());
m_model.setDescription(this->ui->le_Description->text());
m_model.setModelString(this->ui->le_ModelKey->text());
m_model.setName(this->ui->le_Name->text());
return m_model;
CAircraftModel model(m_originalModel);
model.setSimulatorInfo(this->ui->selector_Simulator->getValue());
model.setDescription(this->ui->le_Description->text());
model.setModelString(this->ui->le_ModelKey->text());
model.setName(this->ui->le_Name->text());
return model;
}
CStatusMessageList CModelMappingForm::validate(bool withNestedForms) const
@@ -63,6 +64,7 @@ namespace BlackGui
ui->le_Description->setText(model.getDescription());
ui->le_Name->setText(model.getName());
ui->selector_Simulator->setValue(model.getSimulatorInfo());
m_originalModel = model;
}
} // ns
} // ns

View File

@@ -37,7 +37,7 @@ namespace BlackGui
~CModelMappingForm();
//! Value
const BlackMisc::Simulation::CAircraftModel &getValue() const;
BlackMisc::Simulation::CAircraftModel getValue() const;
//! Validate
BlackMisc::CStatusMessageList validate(bool withNestedForms) const;
@@ -58,7 +58,7 @@ namespace BlackGui
private:
QScopedPointer<Ui::CModelMappingForm> ui;
mutable BlackMisc::Simulation::CAircraftModel m_model; //!< cached last value
BlackMisc::Simulation::CAircraftModel m_originalModel;
};
} // ns

View File

@@ -34,7 +34,7 @@ namespace BlackMisc
bool success = this->m_vPilotReader->read(false);
if (success)
{
this->m_datastoreModels = this->m_vPilotReader->getRules().toAircraftModels();
this->m_datastoreModels = this->m_vPilotReader->getAsModels();
}
return success;
}

View File

@@ -60,6 +60,7 @@ namespace BlackMisc
int keepModels(const QStringList &modelsToBeKept);
//! To aircraft models
//! \note slow operation, can take a while
BlackMisc::Simulation::CAircraftModelList toAircraftModels() const;
private:

View File

@@ -82,12 +82,12 @@ namespace BlackMisc
// already cached?
{
QReadLocker l(&m_lockData);
if (!m_models.isEmpty() || m_rules.isEmpty()) return m_models;
if (!m_models.isEmpty() || m_rules.isEmpty()) { return m_models; }
if (m_shutdown) { return CAircraftModelList(); }
}
// important: that can take a while and should normally
// run in background
if (m_shutdown) { return CAircraftModelList(); }
CVPilotModelRuleSet rules(getRules()); // thread safe copy
CAircraftModelList models(rules.toAircraftModels()); // long lasting operation
QWriteLocker l(&m_lockData);
@@ -103,6 +103,7 @@ namespace BlackMisc
void CVPilotRulesReader::gracefulShutdown()
{
QWriteLocker l(&m_lockData);
m_shutdown = true;
}
@@ -151,23 +152,23 @@ namespace BlackMisc
return success;
}
CWorker *CVPilotRulesReader::readASync(bool convertToModels)
CWorker *CVPilotRulesReader::readInBackground(bool convertToModels)
{
// set a thread safe flag
{
QWriteLocker l(&m_lockData);
if (m_asyncLoadInProgress) { return nullptr; }
if (m_asyncLoadInProgress || m_shutdown) { return nullptr; }
m_asyncLoadInProgress = true;
}
BlackMisc::CWorker *worker = BlackMisc::CWorker::fromTask(this, "CVPilotRulesReader", [this, convertToModels]()
{
this->read(convertToModels);
});
worker->then(this, &CVPilotRulesReader::ps_readASyncFinished);
worker->then(this, &CVPilotRulesReader::ps_readInBackgroundFinished);
return worker;
}
void CVPilotRulesReader::ps_readASyncFinished()
void CVPilotRulesReader::ps_readInBackgroundFinished()
{
QWriteLocker l(&m_lockData);
m_asyncLoadInProgress = false;

View File

@@ -71,6 +71,7 @@ namespace BlackMisc
int countRulesLoaded() const;
//! Graceful shutdown
//! \threadsafe
void gracefulShutdown();
//! The standard directory for vPilot mappings
@@ -87,11 +88,12 @@ namespace BlackMisc
//! Load data in background thread
//! \threadsafe
BlackMisc::CWorker *readASync(bool convertToModels);
BlackMisc::CWorker *readInBackground(bool convertToModels);
private slots:
//! Asyncronous read finished
void ps_readASyncFinished();
//! \threadsafe
void ps_readInBackgroundFinished();
private:
QStringList m_fileList; //!< list of file names