From a47f59d1a408fbd18488027bf99ee51adf8640d9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 8 Jul 2018 22:07:20 -0700 Subject: [PATCH] Properly manage the lifetime of polling in the AppView and PcView --- app/backend/computermanager.cpp | 13 +++++-------- app/backend/computermanager.h | 2 +- app/gui/AppView.qml | 20 +++++++++++++------- app/gui/PcView.qml | 20 ++++++++++++++------ 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/app/backend/computermanager.cpp b/app/backend/computermanager.cpp index a6ef73d9..9449af9d 100644 --- a/app/backend/computermanager.cpp +++ b/app/backend/computermanager.cpp @@ -269,7 +269,7 @@ bool NvComputer::update(NvComputer& that) ComputerManager::ComputerManager(QObject *parent) : QObject(parent), - m_Polling(false), + m_PollingRef(0), m_MdnsBrowser(nullptr) { QSettings settings; @@ -302,12 +302,10 @@ void ComputerManager::startPolling() { QWriteLocker lock(&m_Lock); - if (m_Polling) { + if (++m_PollingRef > 1) { return; } - m_Polling = true; - // Start an MDNS query for GameStream hosts m_MdnsBrowser = new QMdnsEngine::Browser(&m_MdnsServer, "_nvstream._tcp.local.", &m_MdnsCache); connect(m_MdnsBrowser, &QMdnsEngine::Browser::serviceAdded, @@ -400,12 +398,11 @@ void ComputerManager::stopPollingAsync() { QWriteLocker lock(&m_Lock); - if (!m_Polling) { + Q_ASSERT(m_PollingRef > 0); + if (--m_PollingRef > 0) { return; } - m_Polling = false; - // Delete machines that haven't been resolved yet while (!m_PendingResolution.isEmpty()) { MdnsPendingComputer* computer = m_PendingResolution.first(); @@ -456,7 +453,7 @@ ComputerManager::handleComputerStateChanged(NvComputer* computer) void ComputerManager::startPollingComputer(NvComputer* computer) { - if (!m_Polling) { + if (m_PollingRef == 0) { return; } diff --git a/app/backend/computermanager.h b/app/backend/computermanager.h index e9fdc0e0..6749ca94 100644 --- a/app/backend/computermanager.h +++ b/app/backend/computermanager.h @@ -279,7 +279,7 @@ private: void startPollingComputer(NvComputer* computer); - bool m_Polling; + int m_PollingRef; QReadWriteLock m_Lock; QMap m_KnownHosts; QMap m_PollThreads; diff --git a/app/gui/AppView.qml b/app/gui/AppView.qml index 1f4a80ff..452450be 100644 --- a/app/gui/AppView.qml +++ b/app/gui/AppView.qml @@ -17,14 +17,20 @@ GridView { cellWidth: 225; cellHeight: 350; focus: true - Component.onCompleted: { - // Start polling when this view is shown - ComputerManager.startPolling() - } + // The StackView will trigger a visibility change when + // we're pushed onto it, causing our onVisibleChanged + // routine to run, but only if we start as invisible + visible: false - Component.onDestruction: { - // Stop polling when this view is destroyed - ComputerManager.stopPollingAsync() + onVisibleChanged: { + if (visible) { + // Start polling when this view is shown + ComputerManager.startPolling() + } + else { + // Stop polling when this view is not on top + ComputerManager.stopPollingAsync() + } } function createModel() diff --git a/app/gui/PcView.qml b/app/gui/PcView.qml index 4147c62c..8b3bdcde 100644 --- a/app/gui/PcView.qml +++ b/app/gui/PcView.qml @@ -19,17 +19,25 @@ GridView { focus: true objectName: "Computers" - Component.onCompleted: { - // Start polling when this view is shown - ComputerManager.startPolling() + // The StackView will trigger a visibility change when + // we're pushed onto it, causing our onVisibleChanged + // routine to run, but only if we start as invisible + visible: false + Component.onCompleted: { // Setup signals on CM ComputerManager.computerAddCompleted.connect(addComplete) } - Component.onDestruction: { - // Stop polling when this view is destroyed - ComputerManager.stopPollingAsync() + onVisibleChanged: { + if (visible) { + // Start polling when this view is shown + ComputerManager.startPolling() + } + else { + // Stop polling when this view is not top-most + ComputerManager.stopPollingAsync() + } } function pairingComplete(error)