mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-30 05:51:23 +08:00
(QObject:connec robust to threading issues)
This commit is contained in:
committed by
Mathew Sutcliffe
parent
938c0f3dc8
commit
d8e0ff83e6
@@ -136,23 +136,27 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<QMetaObject::Connection> CAirspaceMonitor::connectRemoteAircraftProviderSignals(
|
QList<QMetaObject::Connection> CAirspaceMonitor::connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void(const CAircraftSituation &)> situationSlot,
|
std::function<void(const CAircraftSituation &)> situationSlot,
|
||||||
std::function<void(const CAircraftParts &)> partsSlot,
|
std::function<void(const CAircraftParts &)> partsSlot,
|
||||||
std::function<void(const CCallsign &)> removedAircraftSlot,
|
std::function<void(const CCallsign &)> removedAircraftSlot,
|
||||||
std::function<void(const CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
|
std::function<void(const CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// bind does not allow to define connection type
|
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
|
||||||
// so anything in its own thread will be sent with this thread affinity
|
|
||||||
QMetaObject::Connection c1 = connect(this, &CAirspaceMonitor::addedAircraftSituation, situationSlot);
|
// 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");
|
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");
|
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");
|
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
|
// trick is to use the Queued signal here
|
||||||
// analyzer (own thread) -> airspaceAircraftSnapshot -> AirspaceMonitor -> airspaceAircraftSnapshot queued in main thread
|
// 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");
|
Q_ASSERT_X(c4, Q_FUNC_INFO, "connect failed");
|
||||||
return QList<QMetaObject::Connection>({ c1, c2, c3, c4});
|
return QList<QMetaObject::Connection>({ c1, c2, c3, c4});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ namespace BlackCore
|
|||||||
|
|
||||||
//! \copydoc IRemoteAircraftProvider::connectRemoteAircraftProviderSignals
|
//! \copydoc IRemoteAircraftProvider::connectRemoteAircraftProviderSignals
|
||||||
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
||||||
|
|||||||
@@ -127,13 +127,14 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<QMetaObject::Connection> CContextNetwork::connectRemoteAircraftProviderSignals(
|
QList<QMetaObject::Connection> CContextNetwork::connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void (const CAircraftSituation &)> situationSlot,
|
std::function<void (const CAircraftSituation &)> situationSlot,
|
||||||
std::function<void (const CAircraftParts &)> partsSlot,
|
std::function<void (const CAircraftParts &)> partsSlot,
|
||||||
std::function<void (const CCallsign &)> removedAircraftSlot,
|
std::function<void (const CCallsign &)> removedAircraftSlot,
|
||||||
std::function<void (const BlackMisc::Simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot)
|
std::function<void (const BlackMisc::Simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot)
|
||||||
{
|
{
|
||||||
Q_ASSERT(this->m_airspace);
|
Q_ASSERT_X(this->m_airspace, Q_FUNC_INFO, "Missing airspace");
|
||||||
return this->m_airspace->connectRemoteAircraftProviderSignals(situationSlot, partsSlot, removedAircraftSlot, aircraftSnapshotSlot);
|
return this->m_airspace->connectRemoteAircraftProviderSignals(receiver, situationSlot, partsSlot, removedAircraftSlot, aircraftSnapshotSlot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContextNetwork::gracefulShutdown()
|
void CContextNetwork::gracefulShutdown()
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ namespace BlackCore
|
|||||||
//! \copydoc IRemoteAircraftProvider::connectSignals
|
//! \copydoc IRemoteAircraftProvider::connectSignals
|
||||||
//! \ingroup remoteaircraftprovider
|
//! \ingroup remoteaircraftprovider
|
||||||
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ namespace BlackCore
|
|||||||
|
|
||||||
// provider signals
|
// provider signals
|
||||||
m_remoteAircraftProviderConnections = this->m_remoteAircraftProvider->connectRemoteAircraftProviderSignals(
|
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_remoteProviderAddAircraftSituation, this, std::placeholders::_1),
|
||||||
std::bind(&CSimulatorCommon::ps_remoteProviderAddAircraftParts, this, std::placeholders::_1),
|
std::bind(&CSimulatorCommon::ps_remoteProviderAddAircraftParts, this, std::placeholders::_1),
|
||||||
std::bind(&CSimulatorCommon::ps_remoteProviderRemovedAircraft, this, std::placeholders::_1),
|
std::bind(&CSimulatorCommon::ps_remoteProviderRemovedAircraft, this, std::placeholders::_1),
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ namespace BlackMisc
|
|||||||
//! In order to disconnect a list of connections is provided, which have to be disconnected manually.
|
//! 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
|
//! \note connections are direct as functors have no parameter for connection type
|
||||||
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
||||||
|
|||||||
@@ -66,18 +66,20 @@ namespace BlackMisc
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<QMetaObject::Connection> CRemoteAircraftProviderDummy::connectRemoteAircraftProviderSignals(
|
QList<QMetaObject::Connection> CRemoteAircraftProviderDummy::connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void (const CAircraftSituation &)> situationSlot,
|
std::function<void (const CAircraftSituation &)> situationSlot,
|
||||||
std::function<void (const CAircraftParts &)> partsSlot,
|
std::function<void (const CAircraftParts &)> partsSlot,
|
||||||
std::function<void (const CCallsign &)> removedAircraftSlot,
|
std::function<void (const CCallsign &)> removedAircraftSlot,
|
||||||
std::function<void (const CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
|
std::function<void (const CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
|
||||||
QList<QMetaObject::Connection> c(
|
QList<QMetaObject::Connection> c(
|
||||||
{
|
{
|
||||||
connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftSituation, situationSlot) ,
|
connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftSituation, receiver, situationSlot) ,
|
||||||
connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftParts, partsSlot) ,
|
connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftParts, receiver, partsSlot) ,
|
||||||
connect(this, &CRemoteAircraftProviderDummy::removedRemoteAircraft, removedAircraftSlot) ,
|
connect(this, &CRemoteAircraftProviderDummy::removedRemoteAircraft, receiver, removedAircraftSlot) ,
|
||||||
connect(this, &CRemoteAircraftProviderDummy::airspaceAircraftSnapshot, aircraftSnapshotSlot)
|
connect(this, &CRemoteAircraftProviderDummy::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot)
|
||||||
});
|
});
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ namespace BlackMisc
|
|||||||
|
|
||||||
//! \copydoc IRemoteAircraftProvider::connectRemoteAircraftProviderSignals
|
//! \copydoc IRemoteAircraftProvider::connectRemoteAircraftProviderSignals
|
||||||
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
||||||
|
QObject *receiver,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> addedPartsSlot,
|
||||||
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
|
||||||
|
|||||||
Reference in New Issue
Block a user