From c1acc1fa698ddbff0f604e158f243ca7f37ee19b Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 29 Apr 2014 14:04:59 +0200 Subject: [PATCH] refs #187, asyncConnectTo method to avoid freeze when starting GUI/Core * as discussed in https://dev.vatsim-germany.org/issues/187#change-1183 * using no longer connectTo() but asyncConnectTo() in constructor of simulator context * changed Interface doxygen comments to copydoc --- src/blackcore/context_simulator.h | 3 +++ src/blackcore/context_simulator_impl.cpp | 17 ++++++++++++----- src/blackcore/context_simulator_impl.h | 19 ++++++++++++------- src/blackcore/context_simulator_proxy.cpp | 5 +++++ src/blackcore/context_simulator_proxy.h | 17 ++++++++++------- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 72dd28543..a80f24966 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -62,6 +62,9 @@ namespace BlackCore //! \brief Connect to simulator virtual bool connectTo() = 0; + //! \brief Connect to simulator (asynchronous version) + virtual void asyncConnectTo() = 0; + //! \brief Disconnect from simulator virtual bool disconnectFrom() = 0; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index d1f8c785f..c45cce6d6 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -24,7 +24,7 @@ namespace BlackCore loadSimulatorPlugin(CSimulatorInfo::FSX()); connect(m_updateTimer, &QTimer::timeout, this, &CContextSimulator::updateOwnAircraft); - connectTo(); + asyncConnectTo(); } CContextSimulator::~CContextSimulator() @@ -36,7 +36,7 @@ namespace BlackCore CSimulatorInfoList CContextSimulator::getAvailableSimulatorPlugins() const { CSimulatorInfoList simulatorPlugins; - foreach(ISimulatorFactory *factory, m_simulatorFactories) + foreach(ISimulatorFactory * factory, m_simulatorFactories) { simulatorPlugins.push_back(factory->getSimulatorInfo()); } @@ -64,6 +64,13 @@ namespace BlackCore return m_simulator->connectTo(); } + void CContextSimulator::asyncConnectTo() + { + if (this->getRuntime()->isSlotLogForSimulatorEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO); + if (!m_simulator || m_canConnectResult.isRunning()) return; // already checking + this->m_canConnectResult = QtConcurrent::run(this, &CContextSimulator::connectTo); + } + bool CContextSimulator::disconnectFrom() { if (this->getRuntime()->isSlotLogForSimulatorEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO); @@ -87,12 +94,12 @@ namespace BlackCore bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo) { ISimulatorFactory *factory = nullptr; - QSet::iterator iterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory *factory) + QSet::iterator iterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory * factory) { return factory->getSimulatorInfo() == simulatorInfo; }); - if(iterator == m_simulatorFactories.end()) + if (iterator == m_simulatorFactories.end()) return false; factory = *iterator; @@ -107,7 +114,7 @@ namespace BlackCore void CContextSimulator::unloadSimulatorPlugin() { - if(m_simulator) + if (m_simulator) m_simulator->deleteLater(); m_simulator = nullptr; diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 58ca7e132..8dee4274b 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -15,6 +15,7 @@ #include #include +#include namespace BlackCore { @@ -35,17 +36,20 @@ namespace BlackCore //! \copydoc IContextSimulator::getSimulatorPluginList() virtual BlackSim::CSimulatorInfoList getAvailableSimulatorPlugins() const override; - + //! \copydoc IContextSimulator::isConnected() virtual bool isConnected() const override; - //! \brief Can we connect? + //! \copydoc IContextSimulator::canConnect virtual bool canConnect() override; - //! \brief Connect to simulator + //! \copydoc IContextSimulator::connectTo virtual bool connectTo() override; - //! \brief Disconnect from simulator + //! \copydoc IContextSimulator::asyncConnectTo + virtual void asyncConnectTo() override; + + //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFrom() override; //! \copydoc IContextSimulator::getOwnAircraft() @@ -55,10 +59,10 @@ namespace BlackCore virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; //! \copydoc IContextSimulator::loadSimulatorPlugin() - virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) override; + virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override; //! \copydoc IContextSimulator::unloadSimulatorPlugin() - virtual void unloadSimulatorPlugin () override; + virtual void unloadSimulatorPlugin() override; protected: //! \brief Constructor @@ -87,7 +91,8 @@ namespace BlackCore BlackCore::ISimulator *m_simulator; QTimer *m_updateTimer; QDir m_pluginsDir; - QSet m_simulatorFactories; + QSet m_simulatorFactories; + QFuture m_canConnectResult; }; } // namespace BlackCore diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index 80326f7b9..68fbe3a9d 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -48,6 +48,11 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("connectTo")); } + void CContextSimulatorProxy::asyncConnectTo() + { + m_dBusInterface->callDBus(QLatin1Literal("asyncConnectTo")); + } + bool CContextSimulatorProxy::disconnectFrom() { return m_dBusInterface->callDBusRet(QLatin1Literal("disconnectFrom")); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index e97d257cd..946ac6a5f 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -35,20 +35,23 @@ namespace BlackCore CContextSimulatorProxy(const QString &serviceName, QDBusConnection &connection, CRuntimeConfig::ContextMode mode, CRuntime *runtime); public slots: - - //! \copydoc IContextSimulator::getSimulatorPluginList() + + //! \copydoc IContextSimulator::getSimulatorPluginList() virtual BlackSim::CSimulatorInfoList getAvailableSimulatorPlugins() const override; //! \copydoc IContextSimulator::isConnected() virtual bool isConnected() const override; - //! \brief Can we connect? + //! \copydoc IContextSimulator::canConnect virtual bool canConnect() override; - //! \brief Connect to simulator + //! \copydoc IContextSimulator::connectTo virtual bool connectTo() override; - //! \brief Disconnect from simulator + //! \copydoc IContextSimulator::asyncConnectTo + virtual void asyncConnectTo() override; + + //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFrom() override; //! \copydoc IContextSimulator::getOwnAircraft() @@ -58,10 +61,10 @@ namespace BlackCore virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; //! \copydoc IContextSimulator::loadSimulatorPlugin - virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) override; + virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override; //! \copydoc IContextSimulator::unloadSimulatorPlugin() - virtual void unloadSimulatorPlugin () override; + virtual void unloadSimulatorPlugin() override; }; } // namespace BlackCore