diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index a5492c489..da549404e 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -136,23 +136,27 @@ namespace BlackCore } QList CAirspaceMonitor::connectRemoteAircraftProviderSignals( + QObject *receiver, std::function situationSlot, std::function partsSlot, std::function removedAircraftSlot, std::function aircraftSnapshotSlot ) { - // bind does not allow to define connection type - // so anything in its own thread will be sent with this thread affinity - QMetaObject::Connection c1 = connect(this, &CAirspaceMonitor::addedAircraftSituation, situationSlot); + Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver"); + + // bind does not allow to define connection type, so we use receiver as workaround + QMetaObject::Connection c1 = connect(this, &CAirspaceMonitor::addedAircraftSituation, receiver, situationSlot); Q_ASSERT_X(c1, Q_FUNC_INFO, "connect failed"); - QMetaObject::Connection c2 = connect(this, &CAirspaceMonitor::addedAircraftParts, partsSlot); + QMetaObject::Connection c2 = connect(this, &CAirspaceMonitor::addedAircraftParts, receiver, partsSlot); Q_ASSERT_X(c2, Q_FUNC_INFO, "connect failed"); - QMetaObject::Connection c3 = connect(this, &CAirspaceMonitor::removedAircraft, removedAircraftSlot); + QMetaObject::Connection c3 = connect(this, &CAirspaceMonitor::removedAircraft, receiver, removedAircraftSlot); Q_ASSERT_X(c3, Q_FUNC_INFO, "connect failed"); + //! \todo remove old workaround if new version with receiver works // trick is to use the Queued signal here // analyzer (own thread) -> airspaceAircraftSnapshot -> AirspaceMonitor -> airspaceAircraftSnapshot queued in main thread - QMetaObject::Connection c4 = this->connect(this, &CAirspaceMonitor::airspaceAircraftSnapshot, aircraftSnapshotSlot); + // QMetaObject::Connection c4 = this->connect(this, &CAirspaceMonitor::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot); + QMetaObject::Connection c4 = this->connect(this->m_analyzer, &CAirspaceAnalyzer::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot, Qt::QueuedConnection); Q_ASSERT_X(c4, Q_FUNC_INFO, "connect failed"); return QList({ c1, c2, c3, c4}); } diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index e4163d048..dc522d4e9 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -147,6 +147,7 @@ namespace BlackCore //! \copydoc IRemoteAircraftProvider::connectRemoteAircraftProviderSignals virtual QList connectRemoteAircraftProviderSignals( + QObject *receiver, std::function addedSituationSlot, std::function addedPartsSlot, std::function removedAircraftSlot, diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 30f9b11fa..fe7f3df79 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -127,13 +127,14 @@ namespace BlackCore } QList CContextNetwork::connectRemoteAircraftProviderSignals( + QObject *receiver, std::function situationSlot, std::function partsSlot, std::function removedAircraftSlot, std::function aircraftSnapshotSlot) { - Q_ASSERT(this->m_airspace); - return this->m_airspace->connectRemoteAircraftProviderSignals(situationSlot, partsSlot, removedAircraftSlot, aircraftSnapshotSlot); + Q_ASSERT_X(this->m_airspace, Q_FUNC_INFO, "Missing airspace"); + return this->m_airspace->connectRemoteAircraftProviderSignals(receiver, situationSlot, partsSlot, removedAircraftSlot, aircraftSnapshotSlot); } void CContextNetwork::gracefulShutdown() diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index 232455f43..10fa04294 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -73,6 +73,7 @@ namespace BlackCore //! \copydoc IRemoteAircraftProvider::connectSignals //! \ingroup remoteaircraftprovider virtual QList connectRemoteAircraftProviderSignals( + QObject *receiver, std::function addedSituationSlot, std::function addedPartsSlot, std::function removedAircraftSlot, diff --git a/src/blackcore/simulator_common.cpp b/src/blackcore/simulator_common.cpp index 134315f9b..c8fc82f4c 100644 --- a/src/blackcore/simulator_common.cpp +++ b/src/blackcore/simulator_common.cpp @@ -36,6 +36,7 @@ namespace BlackCore // provider signals m_remoteAircraftProviderConnections = this->m_remoteAircraftProvider->connectRemoteAircraftProviderSignals( + this, // receiver must match object in bind std::bind(&CSimulatorCommon::ps_remoteProviderAddAircraftSituation, this, std::placeholders::_1), std::bind(&CSimulatorCommon::ps_remoteProviderAddAircraftParts, this, std::placeholders::_1), std::bind(&CSimulatorCommon::ps_remoteProviderRemovedAircraft, this, std::placeholders::_1), diff --git a/src/blackmisc/simulation/remoteaircraftprovider.h b/src/blackmisc/simulation/remoteaircraftprovider.h index b2005365e..366c35bf3 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -104,6 +104,7 @@ namespace BlackMisc //! In order to disconnect a list of connections is provided, which have to be disconnected manually. //! \note connections are direct as functors have no parameter for connection type virtual QList connectRemoteAircraftProviderSignals( + QObject *receiver, std::function addedSituationSlot, std::function addedPartsSlot, std::function removedAircraftSlot, diff --git a/src/blackmisc/simulation/remoteaircraftproviderdummy.cpp b/src/blackmisc/simulation/remoteaircraftproviderdummy.cpp index dec5bcf4d..1fc693ce2 100644 --- a/src/blackmisc/simulation/remoteaircraftproviderdummy.cpp +++ b/src/blackmisc/simulation/remoteaircraftproviderdummy.cpp @@ -66,18 +66,20 @@ namespace BlackMisc } QList CRemoteAircraftProviderDummy::connectRemoteAircraftProviderSignals( + QObject *receiver, std::function situationSlot, std::function partsSlot, std::function removedAircraftSlot, std::function aircraftSnapshotSlot ) { + Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver"); QList c( { - connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftSituation, situationSlot) , - connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftParts, partsSlot) , - connect(this, &CRemoteAircraftProviderDummy::removedRemoteAircraft, removedAircraftSlot) , - connect(this, &CRemoteAircraftProviderDummy::airspaceAircraftSnapshot, aircraftSnapshotSlot) + connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftSituation, receiver, situationSlot) , + connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftParts, receiver, partsSlot) , + connect(this, &CRemoteAircraftProviderDummy::removedRemoteAircraft, receiver, removedAircraftSlot) , + connect(this, &CRemoteAircraftProviderDummy::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot) }); return c; } diff --git a/src/blackmisc/simulation/remoteaircraftproviderdummy.h b/src/blackmisc/simulation/remoteaircraftproviderdummy.h index c6369e5ef..c8f664c82 100644 --- a/src/blackmisc/simulation/remoteaircraftproviderdummy.h +++ b/src/blackmisc/simulation/remoteaircraftproviderdummy.h @@ -61,6 +61,7 @@ namespace BlackMisc //! \copydoc IRemoteAircraftProvider::connectRemoteAircraftProviderSignals virtual QList connectRemoteAircraftProviderSignals( + QObject *receiver, std::function addedSituationSlot, std::function addedPartsSlot, std::function removedAircraftSlot,