diff --git a/src/Terrain.cc b/src/Terrain.cc index 43367fe32cabbe123d3eebc1a2e4fb78d66265ae..1d89ca9c9aa17bb1bed44f3b91bfb52c029dbeaf 100644 --- a/src/Terrain.cc +++ b/src/Terrain.cc @@ -33,6 +33,8 @@ TerrainBatchManager::TerrainBatchManager(void) void TerrainBatchManager::addQuery(ElevationProvider* elevationProvider, const QList& coordinates) { if (coordinates.length() > 0) { + qCDebug(ElevationProviderLog) << "addQuery: elevationProvider:coordinates.count" << elevationProvider << coordinates.count(); + connect(elevationProvider, &ElevationProvider::destroyed, this, &TerrainBatchManager::_elevationProviderDestroyed); QueuedRequestInfo_t queuedRequestInfo = { elevationProvider, coordinates }; _requestQueue.append(queuedRequestInfo); if (!_batchTimer.isActive()) { @@ -43,7 +45,7 @@ void TerrainBatchManager::addQuery(ElevationProvider* elevationProvider, const Q void TerrainBatchManager::_sendNextBatch(void) { - qCDebug(ElevationProviderLog) << "_sendNextBatch _state:_requestQueue.count" << (int)_state << _requestQueue.count(); + qCDebug(ElevationProviderLog) << "_sendNextBatch _state:_requestQueue.count:_sentRequests.count" << _stateToString(_state) << _requestQueue.count() << _sentRequests.count(); if (_state != State::Idle) { // Waiting for last download the complete, wait some more @@ -60,7 +62,7 @@ void TerrainBatchManager::_sendNextBatch(void) // Convert coordinates to point strings for json query QString points; foreach (const QueuedRequestInfo_t& requestInfo, _requestQueue) { - SentRequestInfo_t sentRequestInfo = { requestInfo.elevationProvider, requestInfo.coordinates.count() }; + SentRequestInfo_t sentRequestInfo = { requestInfo.elevationProvider, false, requestInfo.coordinates.count() }; qCDebug(ElevationProviderLog) << "Building request: coordinate count" << requestInfo.coordinates.count(); _sentRequests.append(sentRequestInfo); @@ -100,7 +102,10 @@ void TerrainBatchManager::_batchFailed(void) QList noAltitudes; foreach (const SentRequestInfo_t& sentRequestInfo, _sentRequests) { - sentRequestInfo.elevationProvider->_signalTerrainData(false, noAltitudes); + if (!sentRequestInfo.providerDestroyed) { + disconnect(sentRequestInfo.elevationProvider, &ElevationProvider::destroyed, this, &TerrainBatchManager::_elevationProviderDestroyed); + sentRequestInfo.elevationProvider->_signalTerrainData(false, noAltitudes); + } } _sentRequests.clear(); } @@ -145,15 +150,54 @@ void TerrainBatchManager::_requestFinished() int currentIndex = 0; foreach (const SentRequestInfo_t& sentRequestInfo, _sentRequests) { - QList requestAltitudes = altitudes.mid(currentIndex, sentRequestInfo.cCoord); - sentRequestInfo.elevationProvider->_signalTerrainData(true, requestAltitudes); - currentIndex += sentRequestInfo.cCoord; + if (!sentRequestInfo.providerDestroyed) { + disconnect(sentRequestInfo.elevationProvider, &ElevationProvider::destroyed, this, &TerrainBatchManager::_elevationProviderDestroyed); + QList requestAltitudes = altitudes.mid(currentIndex, sentRequestInfo.cCoord); + sentRequestInfo.elevationProvider->_signalTerrainData(true, requestAltitudes); + currentIndex += sentRequestInfo.cCoord; + } } _sentRequests.clear(); reply->deleteLater(); } +void TerrainBatchManager::_elevationProviderDestroyed(QObject* elevationProvider) +{ + // Remove/Mark deleted objects queries from queues + + qCDebug(ElevationProviderLog) << "_elevationProviderDestroyed elevationProvider" << elevationProvider; + + int i = 0; + while (i < _requestQueue.count()) { + const QueuedRequestInfo_t& requestInfo = _requestQueue[i]; + if (requestInfo.elevationProvider == elevationProvider) { + qCDebug(ElevationProviderLog) << "Removing deleted provider from _requestQueue index:elevationProvider" << i << requestInfo.elevationProvider; + _requestQueue.removeAt(i); + } else { + i++; + } + } + + for (int i=0; i<_sentRequests.count(); i++) { + SentRequestInfo_t& sentRequestInfo = _sentRequests[i]; + if (sentRequestInfo.elevationProvider == elevationProvider) { + qCDebug(ElevationProviderLog) << "Zombieing deleted provider from _sentRequests index:elevatationProvider" << sentRequestInfo.elevationProvider; + sentRequestInfo.providerDestroyed = true; + } + } +} + +QString TerrainBatchManager::_stateToString(State state) +{ + switch (state) { + case State::Idle: + return QStringLiteral("Idle"); + case State::Downloading: + return QStringLiteral("Downloading"); + } +} + ElevationProvider::ElevationProvider(QObject* parent) : QObject(parent) { @@ -161,7 +205,6 @@ ElevationProvider::ElevationProvider(QObject* parent) } void ElevationProvider::queryTerrainData(const QList& coordinates) { - qCDebug(ElevationProviderLog) << "queryTerrainData: coordinate count" << coordinates.count(); if (coordinates.length() == 0) { return; } diff --git a/src/Terrain.h b/src/Terrain.h index 549db64c7b7f22ee3aabcc681e05d559a4d25e3a..92f3f330a98574e3debf9661a1492d0958220e28 100644 --- a/src/Terrain.h +++ b/src/Terrain.h @@ -30,8 +30,9 @@ public: void addQuery(ElevationProvider* elevationProvider, const QList& coordinates); private slots: - void _sendNextBatch (void); - void _requestFinished (void); + void _sendNextBatch (void); + void _requestFinished (void); + void _elevationProviderDestroyed (QObject* elevationProvider); private: typedef struct { @@ -41,6 +42,7 @@ private: typedef struct { ElevationProvider* elevationProvider; + bool providerDestroyed; int cCoord; } SentRequestInfo_t; @@ -51,6 +53,7 @@ private: }; void _batchFailed(void); + QString _stateToString(State state); QList _requestQueue; QList _sentRequests;