From d6d2c0cc80efabe53d087f32eb3eb96694c78515 Mon Sep 17 00:00:00 2001 From: Roland Rossgotterer Date: Wed, 13 Feb 2019 14:55:56 +0100 Subject: [PATCH] [FS9] Stop using Fs9Host and Fs9Client as CContinuousWorkers Both were continuous workers since a blocking IDirectPlay8Peer::SendTo() method was used. Since we use the default async method now, we don't need the threaded implementation any longer. It still could happen that GUI blocks for too long, but that would happen also for other simulator drivers. ref T433 --- src/plugins/simulator/fs9/directplaypeer.cpp | 8 ++----- src/plugins/simulator/fs9/directplaypeer.h | 7 ++---- src/plugins/simulator/fs9/fs9client.cpp | 24 ++++++++------------ src/plugins/simulator/fs9/fs9client.h | 10 +++----- src/plugins/simulator/fs9/fs9host.cpp | 23 ++++++++----------- src/plugins/simulator/fs9/fs9host.h | 9 +------- src/plugins/simulator/fs9/simulatorfs9.cpp | 6 ++--- 7 files changed, 29 insertions(+), 58 deletions(-) diff --git a/src/plugins/simulator/fs9/directplaypeer.cpp b/src/plugins/simulator/fs9/directplaypeer.cpp index f465baeec..f35ba2638 100644 --- a/src/plugins/simulator/fs9/directplaypeer.cpp +++ b/src/plugins/simulator/fs9/directplaypeer.cpp @@ -17,7 +17,6 @@ #include #include #include -#include using namespace BlackMisc; using namespace BlackMisc::Aviation; @@ -32,10 +31,9 @@ namespace BlackSimPlugin return cats; } - CDirectPlayPeer::CDirectPlayPeer(QObject *owner, const CCallsign &callsign) - : CContinuousWorker(owner, "peer_" + callsign.toQString()), + CDirectPlayPeer::CDirectPlayPeer(QObject *parent, const CCallsign &callsign) + : QObject(parent), m_callsign(callsign), - m_mutexHostList(QMutex::Recursive), m_callbackWrapper(this, &CDirectPlayPeer::directPlayMessageHandler) { } @@ -115,8 +113,6 @@ namespace BlackSimPlugin PDPNMSG_ENUM_HOSTS_RESPONSE enumHostsResponseMsg = static_cast(msgBuffer); const DPN_APPLICATION_DESC *applicationDescription = enumHostsResponseMsg->pApplicationDescription; - QMutexLocker locker(&m_mutexHostList); - auto iterator = std::find_if(m_hostNodeList.begin(), m_hostNodeList.end(), [&](const CHostNode & hostNode) { return applicationDescription->guidInstance == hostNode.getApplicationDesc().guidInstance; diff --git a/src/plugins/simulator/fs9/directplaypeer.h b/src/plugins/simulator/fs9/directplaypeer.h index dfadc82e0..2f2fa06cf 100644 --- a/src/plugins/simulator/fs9/directplaypeer.h +++ b/src/plugins/simulator/fs9/directplaypeer.h @@ -18,7 +18,6 @@ #include "blackmisc/logcategorylist.h" #include #include -#include #include #include #include @@ -31,13 +30,13 @@ namespace BlackSimPlugin //! DirectPlay peer implementation //! More information can be found in the DirectX9 SDK documentation //! http://doc.51windows.net/Directx9_SDK/?url=/Directx9_SDK/play/dplay.htm - class CDirectPlayPeer : public BlackMisc::CContinuousWorker + class CDirectPlayPeer : public QObject { Q_OBJECT public: //! Constructor - CDirectPlayPeer(QObject *owner, const BlackMisc::Aviation::CCallsign &callsign); + CDirectPlayPeer(QObject *parent, const BlackMisc::Aviation::CCallsign &callsign); //! Destructor virtual ~CDirectPlayPeer(); @@ -91,8 +90,6 @@ namespace BlackSimPlugin // We need the Id of the users player, because we are sending packets only to him std::atomic m_playerUser = {0}; //!< User player Id - QMutex m_mutexHostList; //!< Host list mutex - using TCallbackWrapper = CallbackWrapper; //!< DirectPlay peer message handler wrapper TCallbackWrapper m_callbackWrapper; //!< Callback wrapper }; diff --git a/src/plugins/simulator/fs9/fs9client.cpp b/src/plugins/simulator/fs9/fs9client.cpp index c4242fc15..0f7d081cd 100644 --- a/src/plugins/simulator/fs9/fs9client.cpp +++ b/src/plugins/simulator/fs9/fs9client.cpp @@ -137,6 +137,7 @@ namespace BlackSimPlugin CFs9Client::~CFs9Client() { + closeConnection(); SafeRelease(m_hostAddress); } @@ -172,6 +173,13 @@ namespace BlackSimPlugin } } + void CFs9Client::start() + { + initDirectPlay(); + createDeviceAddress(); + connectToSession(m_callsign); + } + CStatusMessageList CFs9Client::getInterpolationMessages(CInterpolationAndRenderingSetupBase::InterpolatorMode mode) const { if (!this->getInterpolator()) { return CStatusMessageList(); } @@ -195,18 +203,6 @@ namespace BlackSimPlugin sendMultiplayerParamaters(); } - void CFs9Client::initialize() - { - initDirectPlay(); - createDeviceAddress(); - connectToSession(m_callsign); - } - - void CFs9Client::cleanup() - { - closeConnection(); - } - HRESULT CFs9Client::enumDirectPlayHosts() { HRESULT hr = s_ok(); @@ -278,8 +274,6 @@ namespace BlackSimPlugin HRESULT hr = s_ok(); if (m_clientStatus == Connected) { return hr; } - QMutexLocker locker(&m_mutexHostList); - QScopedArrayPointer wszPlayername(new wchar_t[static_cast(callsign.toQString().size() + 1)]); callsign.toQString().toWCharArray(wszPlayername.data()); wszPlayername[callsign.toQString().size()] = 0; @@ -390,7 +384,7 @@ namespace BlackSimPlugin const ISimulator *CFs9Client::simulator() const { - return qobject_cast(this->owner()); + return qobject_cast(this->parent()); } } } diff --git a/src/plugins/simulator/fs9/fs9client.h b/src/plugins/simulator/fs9/fs9client.h index 485f0768b..2515777e4 100644 --- a/src/plugins/simulator/fs9/fs9client.h +++ b/src/plugins/simulator/fs9/fs9client.h @@ -15,7 +15,6 @@ #include "blackmisc/aviation/aircraftsituation.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/pq/time.h" -#include #include #include @@ -52,6 +51,9 @@ namespace BlackSimPlugin //! Set DirectPlay host address void setHostAddress(const QString &hostAddress); + //! Starts the FS9 client messaging + void start(); + //! Get interpolator @{ BlackMisc::Simulation::CInterpolatorMulti *getInterpolator() { return &m_interpolator; } const BlackMisc::Simulation::CInterpolatorMulti *getInterpolator() const { return &m_interpolator; } @@ -72,12 +74,6 @@ namespace BlackSimPlugin //! \copydoc QObject::timerEvent virtual void timerEvent(QTimerEvent *event) override; - //! \copydoc BlackMisc::CContinuousWorker::initialize - virtual void initialize() override; - - //! \copydoc BlackMisc::CContinuousWorker::cleanup - virtual void cleanup() override; - private: //! Enumerate all FS9 session hosts HRESULT enumDirectPlayHosts(); diff --git a/src/plugins/simulator/fs9/fs9host.cpp b/src/plugins/simulator/fs9/fs9host.cpp index 4ed3640d2..8c25abda3 100644 --- a/src/plugins/simulator/fs9/fs9host.cpp +++ b/src/plugins/simulator/fs9/fs9host.cpp @@ -27,7 +27,16 @@ namespace BlackSimPlugin { CFs9Host::CFs9Host(QObject *owner) : CDirectPlayPeer(owner, sApp->swiftVersionString()) - {} + { + initDirectPlay(); + createHostAddress(); + startHosting(sApp->swiftVersionString(), m_callsign.toQString()); + } + + CFs9Host::~CFs9Host() + { + stopHosting(); + } QString CFs9Host::getHostAddress() { @@ -73,18 +82,6 @@ namespace BlackSimPlugin sendMessage(message); } - void CFs9Host::initialize() - { - initDirectPlay(); - createHostAddress(); - startHosting(sApp->swiftVersionString(), m_callsign.toQString()); - } - - void CFs9Host::cleanup() - { - stopHosting(); - } - HRESULT CFs9Host::startHosting(const QString &session, const QString &callsign) { HRESULT hr = S_OK; diff --git a/src/plugins/simulator/fs9/fs9host.h b/src/plugins/simulator/fs9/fs9host.h index ec1ad9c19..359613202 100644 --- a/src/plugins/simulator/fs9/fs9host.h +++ b/src/plugins/simulator/fs9/fs9host.h @@ -35,7 +35,7 @@ namespace BlackSimPlugin CFs9Host(QObject *owner); //! Destructor - virtual ~CFs9Host() {} + virtual ~CFs9Host(); //! Returns true if the users simulator is connected bool isConnected() const { return m_playerUser != 0; } @@ -51,13 +51,6 @@ namespace BlackSimPlugin //! Hosting status changed void statusChanged(BlackSimPlugin::Fs9::CFs9Host::HostStatus); - protected: - //! \copydoc BlackMisc::CContinuousWorker::initialize - virtual void initialize() override; - - //! \copydoc BlackMisc::CContinuousWorker::cleanup - virtual void cleanup() override; - private: //! Start host session HRESULT startHosting(const QString &session, const QString &callsign); diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index c7acced32..84d6960a7 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -193,7 +193,7 @@ namespace BlackSimPlugin if (!m_hashFs9Clients.contains(callsign)) { return false; } auto fs9Client = m_hashFs9Clients.value(callsign); - fs9Client->quit(); + delete fs9Client; m_hashFs9Clients.remove(callsign); updateAircraftRendered(callsign, false); CLogMessage(this).info(u"FS9: Removed aircraft %1") << callsign.toQString(); @@ -466,7 +466,7 @@ namespace BlackSimPlugin static void cleanupFs9Host(CFs9Host *host) { - host->quitAndWait(); + delete host; } CSimulatorFs9Factory::CSimulatorFs9Factory(QObject *parent) : @@ -478,8 +478,6 @@ namespace BlackSimPlugin /* After FS9 is disconnected, reset its data stored in the host */ connect(m_lobbyClient.data(), &CLobbyClient::disconnected, m_fs9Host.data(), &CFs9Host::reset); - - m_fs9Host->start(); } CSimulatorFs9Factory::~CSimulatorFs9Factory()