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
This commit is contained in:
Klaus Basan
2014-04-29 14:04:59 +02:00
parent 526149f94d
commit c1acc1fa69
5 changed files with 42 additions and 19 deletions

View File

@@ -62,6 +62,9 @@ namespace BlackCore
//! \brief Connect to simulator //! \brief Connect to simulator
virtual bool connectTo() = 0; virtual bool connectTo() = 0;
//! \brief Connect to simulator (asynchronous version)
virtual void asyncConnectTo() = 0;
//! \brief Disconnect from simulator //! \brief Disconnect from simulator
virtual bool disconnectFrom() = 0; virtual bool disconnectFrom() = 0;

View File

@@ -24,7 +24,7 @@ namespace BlackCore
loadSimulatorPlugin(CSimulatorInfo::FSX()); loadSimulatorPlugin(CSimulatorInfo::FSX());
connect(m_updateTimer, &QTimer::timeout, this, &CContextSimulator::updateOwnAircraft); connect(m_updateTimer, &QTimer::timeout, this, &CContextSimulator::updateOwnAircraft);
connectTo(); asyncConnectTo();
} }
CContextSimulator::~CContextSimulator() CContextSimulator::~CContextSimulator()
@@ -36,7 +36,7 @@ namespace BlackCore
CSimulatorInfoList CContextSimulator::getAvailableSimulatorPlugins() const CSimulatorInfoList CContextSimulator::getAvailableSimulatorPlugins() const
{ {
CSimulatorInfoList simulatorPlugins; CSimulatorInfoList simulatorPlugins;
foreach(ISimulatorFactory *factory, m_simulatorFactories) foreach(ISimulatorFactory * factory, m_simulatorFactories)
{ {
simulatorPlugins.push_back(factory->getSimulatorInfo()); simulatorPlugins.push_back(factory->getSimulatorInfo());
} }
@@ -64,6 +64,13 @@ namespace BlackCore
return m_simulator->connectTo(); 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() bool CContextSimulator::disconnectFrom()
{ {
if (this->getRuntime()->isSlotLogForSimulatorEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO); if (this->getRuntime()->isSlotLogForSimulatorEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO);
@@ -87,12 +94,12 @@ namespace BlackCore
bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo) bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo)
{ {
ISimulatorFactory *factory = nullptr; ISimulatorFactory *factory = nullptr;
QSet<ISimulatorFactory*>::iterator iterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory *factory) QSet<ISimulatorFactory *>::iterator iterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory * factory)
{ {
return factory->getSimulatorInfo() == simulatorInfo; return factory->getSimulatorInfo() == simulatorInfo;
}); });
if(iterator == m_simulatorFactories.end()) if (iterator == m_simulatorFactories.end())
return false; return false;
factory = *iterator; factory = *iterator;
@@ -107,7 +114,7 @@ namespace BlackCore
void CContextSimulator::unloadSimulatorPlugin() void CContextSimulator::unloadSimulatorPlugin()
{ {
if(m_simulator) if (m_simulator)
m_simulator->deleteLater(); m_simulator->deleteLater();
m_simulator = nullptr; m_simulator = nullptr;

View File

@@ -15,6 +15,7 @@
#include <QTimer> #include <QTimer>
#include <QDir> #include <QDir>
#include <QtConcurrent/QtConcurrent>
namespace BlackCore namespace BlackCore
{ {
@@ -39,13 +40,16 @@ namespace BlackCore
//! \copydoc IContextSimulator::isConnected() //! \copydoc IContextSimulator::isConnected()
virtual bool isConnected() const override; virtual bool isConnected() const override;
//! \brief Can we connect? //! \copydoc IContextSimulator::canConnect
virtual bool canConnect() override; virtual bool canConnect() override;
//! \brief Connect to simulator //! \copydoc IContextSimulator::connectTo
virtual bool connectTo() override; virtual bool connectTo() override;
//! \brief Disconnect from simulator //! \copydoc IContextSimulator::asyncConnectTo
virtual void asyncConnectTo() override;
//! \copydoc IContextSimulator::disconnectFrom
virtual bool disconnectFrom() override; virtual bool disconnectFrom() override;
//! \copydoc IContextSimulator::getOwnAircraft() //! \copydoc IContextSimulator::getOwnAircraft()
@@ -55,10 +59,10 @@ namespace BlackCore
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
//! \copydoc IContextSimulator::loadSimulatorPlugin() //! \copydoc IContextSimulator::loadSimulatorPlugin()
virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) override; virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override;
//! \copydoc IContextSimulator::unloadSimulatorPlugin() //! \copydoc IContextSimulator::unloadSimulatorPlugin()
virtual void unloadSimulatorPlugin () override; virtual void unloadSimulatorPlugin() override;
protected: protected:
//! \brief Constructor //! \brief Constructor
@@ -87,7 +91,8 @@ namespace BlackCore
BlackCore::ISimulator *m_simulator; BlackCore::ISimulator *m_simulator;
QTimer *m_updateTimer; QTimer *m_updateTimer;
QDir m_pluginsDir; QDir m_pluginsDir;
QSet<ISimulatorFactory*> m_simulatorFactories; QSet<ISimulatorFactory *> m_simulatorFactories;
QFuture<bool> m_canConnectResult;
}; };
} // namespace BlackCore } // namespace BlackCore

View File

@@ -48,6 +48,11 @@ namespace BlackCore
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("connectTo")); return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("connectTo"));
} }
void CContextSimulatorProxy::asyncConnectTo()
{
m_dBusInterface->callDBus(QLatin1Literal("asyncConnectTo"));
}
bool CContextSimulatorProxy::disconnectFrom() bool CContextSimulatorProxy::disconnectFrom()
{ {
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("disconnectFrom")); return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("disconnectFrom"));

View File

@@ -42,13 +42,16 @@ namespace BlackCore
//! \copydoc IContextSimulator::isConnected() //! \copydoc IContextSimulator::isConnected()
virtual bool isConnected() const override; virtual bool isConnected() const override;
//! \brief Can we connect? //! \copydoc IContextSimulator::canConnect
virtual bool canConnect() override; virtual bool canConnect() override;
//! \brief Connect to simulator //! \copydoc IContextSimulator::connectTo
virtual bool connectTo() override; virtual bool connectTo() override;
//! \brief Disconnect from simulator //! \copydoc IContextSimulator::asyncConnectTo
virtual void asyncConnectTo() override;
//! \copydoc IContextSimulator::disconnectFrom
virtual bool disconnectFrom() override; virtual bool disconnectFrom() override;
//! \copydoc IContextSimulator::getOwnAircraft() //! \copydoc IContextSimulator::getOwnAircraft()
@@ -58,10 +61,10 @@ namespace BlackCore
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
//! \copydoc IContextSimulator::loadSimulatorPlugin //! \copydoc IContextSimulator::loadSimulatorPlugin
virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) override; virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override;
//! \copydoc IContextSimulator::unloadSimulatorPlugin() //! \copydoc IContextSimulator::unloadSimulatorPlugin()
virtual void unloadSimulatorPlugin () override; virtual void unloadSimulatorPlugin() override;
}; };
} // namespace BlackCore } // namespace BlackCore