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
virtual bool connectTo() = 0;
//! \brief Connect to simulator (asynchronous version)
virtual void asyncConnectTo() = 0;
//! \brief Disconnect from simulator
virtual bool disconnectFrom() = 0;

View File

@@ -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<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;
});
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;

View File

@@ -15,6 +15,7 @@
#include <QTimer>
#include <QDir>
#include <QtConcurrent/QtConcurrent>
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<ISimulatorFactory*> m_simulatorFactories;
QSet<ISimulatorFactory *> m_simulatorFactories;
QFuture<bool> m_canConnectResult;
};
} // namespace BlackCore

View File

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

View File

@@ -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