diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index 23056713f..1ff26974c 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -470,6 +470,7 @@ namespace BlackCore ISimulatorListener *listener = m_plugins->createListener(simulatorInfo.getIdentifier()); if (!listener) { return false; } + if (listener->isRunning()) { return true; } // already running if (listener->thread() != &m_listenersThread) { @@ -510,7 +511,13 @@ namespace BlackCore { if (!m_simulatorPlugin.first.isUnspecified()) { - ISimulator *sim = m_simulatorPlugin.second; + ISimulator *simulator = m_simulatorPlugin.second; + if (simulator->isConnected()) { + // we are about to unload an connected simulator + this->updateMarkAllAsNotRendered(); // without plugin nothing can be rendered + emit this->simulatorStatusChanged(ISimulator::Disconnected); + } + m_simulatorPlugin.second = nullptr; m_simulatorPlugin.first = CSimulatorPluginInfo(); @@ -518,12 +525,12 @@ namespace BlackCore Q_ASSERT(this->getIContextNetwork()->isLocalObject()); // unload and disconnect - if (sim) + if (simulator) { // disconnect signals and delete - sim->disconnect(this); - sim->unload(); - sim->deleteLater(); + simulator->disconnect(this); + simulator->unload(); + simulator->deleteLater(); emit this->simulatorPluginChanged(CSimulatorPluginInfo()); } } @@ -600,6 +607,7 @@ namespace BlackCore if (!status.testFlag(ISimulator::Connected)) { // we got disconnected, plugin no longer needed + this->updateMarkAllAsNotRendered(); // without plugin nothing can be rendered this->unloadSimulatorPlugin(); this->restoreSimulatorPlugins(); } diff --git a/src/blackgui/components/aircraftmodelstringcompleter.cpp b/src/blackgui/components/aircraftmodelstringcompleter.cpp index 797ddcb48..6795915f1 100644 --- a/src/blackgui/components/aircraftmodelstringcompleter.cpp +++ b/src/blackgui/components/aircraftmodelstringcompleter.cpp @@ -47,7 +47,7 @@ namespace BlackGui CSimulatorInfo simulator = CSimulatorInfo(CSimulatorInfo::P3D); // default if (sGui->getIContextSimulator()) { - connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CAircraftModelStringCompleter::onSimulatorConnected); + connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CAircraftModelStringCompleter::onSimulatorConnected, Qt::QueuedConnection); CSimulatorInfo pluginSimulator = sGui->getIContextSimulator()->getSimulatorPluginInfo().getSimulator(); if (pluginSimulator.isSingleSimulator()) { diff --git a/src/blackgui/components/infobarstatuscomponent.cpp b/src/blackgui/components/infobarstatuscomponent.cpp index 0a9a9746e..3157a6cfc 100644 --- a/src/blackgui/components/infobarstatuscomponent.cpp +++ b/src/blackgui/components/infobarstatuscomponent.cpp @@ -53,7 +53,7 @@ namespace BlackGui Q_ASSERT_X(sGui, Q_FUNC_INFO, "Need sGui"); if (sGui->getIContextSimulator()) { - connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CInfoBarStatusComponent::onSimulatorStatusChanged); + connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CInfoBarStatusComponent::onSimulatorStatusChanged, Qt::QueuedConnection); connect(sGui->getIContextSimulator(), &IContextSimulator::modelSetChanged, this, &CInfoBarStatusComponent::onMapperReady); connect(sGui, &CGuiApplication::changedInternetAccessibility, this, &CInfoBarStatusComponent::onInternetAccessibleChanged); diff --git a/src/blackgui/components/simulatorcomponent.cpp b/src/blackgui/components/simulatorcomponent.cpp index d9d46a4b1..1d42d17d7 100644 --- a/src/blackgui/components/simulatorcomponent.cpp +++ b/src/blackgui/components/simulatorcomponent.cpp @@ -62,7 +62,7 @@ namespace BlackGui this->addOrUpdateLiveDataByName("info", "no data yet", CIcons::StandardIconWarning16); // connects - connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CSimulatorComponent::onSimulatorStatusChanged); + connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CSimulatorComponent::onSimulatorStatusChanged, Qt::QueuedConnection); connect(&m_updateTimer, &QTimer::timeout, this, &CSimulatorComponent::update); connect(ui->pb_RefreshInternals, &QPushButton::pressed, this, &CSimulatorComponent::refreshInternals); if (sGui->supportsContexts() && sGui->getIContextSimulator()) diff --git a/src/blackgui/loginmodebuttons.cpp b/src/blackgui/loginmodebuttons.cpp index 681e629b1..b062dfc80 100644 --- a/src/blackgui/loginmodebuttons.cpp +++ b/src/blackgui/loginmodebuttons.cpp @@ -27,8 +27,7 @@ namespace BlackGui { ui->setupUi(this); configureLoginModes(); - connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, - this, &CLoginModeButtons::configureLoginModes); + connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this, &CLoginModeButtons::configureLoginModes, Qt::QueuedConnection); } CLoginModeButtons::~CLoginModeButtons()