From 50f8b09b62078cdff2a7e3786756545b7123c9ed Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 19 Apr 2020 04:13:41 +0200 Subject: [PATCH] Ref T786, weather data parser smaller improvements --- .../weatherdata/gfs/weatherdatagfs.cpp | 24 +++++++++++++------ src/plugins/weatherdata/gfs/weatherdatagfs.h | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/plugins/weatherdata/gfs/weatherdatagfs.cpp b/src/plugins/weatherdata/gfs/weatherdatagfs.cpp index 88c32b634..4a0e0f226 100644 --- a/src/plugins/weatherdata/gfs/weatherdatagfs.cpp +++ b/src/plugins/weatherdata/gfs/weatherdatagfs.cpp @@ -187,7 +187,7 @@ namespace BlackWxPlugin m_gribData = file.readAll(); Q_ASSERT_X(!m_parseGribFileWorker, Q_FUNC_INFO, "Worker already running"); - m_parseGribFileWorker = BlackMisc::CWorker::fromTask(this, "parseGribFile", [this]() + m_parseGribFileWorker = CWorker::fromTask(this, "parseGribFile", [this]() { parseGfsFileImpl(m_gribData); }); @@ -320,8 +320,15 @@ namespace BlackWxPlugin return downloadUrl; } - void CWeatherDataGfs::parseGfsFileImpl(const QByteArray &gribData) + bool CWeatherDataGfs::parseGfsFileImpl(const QByteArray &gribData) { + if (!m_lockData.tryLockForWrite(1000)) + { + CLogMessage(this).warning(u"Cannot log CWeatherDataGfs data"); + return false; + } + + m_lockData.unlock(); QWriteLocker lock(&m_lockData); m_gfsWeatherGrid.clear(); @@ -331,7 +338,7 @@ namespace BlackWxPlugin g2int iseek = 0; for (;;) { - if (QThread::currentThread()->isInterruptionRequested()) { return; } + if (QThread::currentThread()->isInterruptionRequested()) { return false; } // Search next grib field g2int lskip = 0; @@ -376,15 +383,16 @@ namespace BlackWxPlugin } messageNo++; } - CLogMessage(this).debug() << "Parsed" << messageNo << "GRIB messages."; + + CLogMessage(this).debug() << "Parsed" << messageNo << "GRIB messages."; + CLogMessage(this).debug() << "Obtained" << m_gfsWeatherGrid.size() << "grid points."; for (const GfsGridPoint &gfsGridPoint : as_const(m_gfsWeatherGrid)) { - if (QThread::currentThread()->isInterruptionRequested()) { return; } + if (QThread::currentThread()->isInterruptionRequested()) { return false; } CTemperatureLayerList temperatureLayers; CWindLayerList windLayers; - for (const GfsIsobaricLayer &isobaricLayer : gfsGridPoint.isobaricLayers) { float level = gfsGridPoint.isobaricLayers.key(isobaricLayer); @@ -408,7 +416,7 @@ namespace BlackWxPlugin } CCloudLayerList cloudLayers; - for (const GfsCloudLayer &gfsCloudLayer : gfsGridPoint.cloudLayers) + for (const GfsCloudLayer &gfsCloudLayer : as_const(gfsGridPoint.cloudLayers)) { if (std::isnan(gfsCloudLayer.bottomLevelPressure) || std::isnan(gfsCloudLayer.topLevelPressure) || std::isnan(gfsCloudLayer.topLevelTemperature)) { continue; } @@ -436,6 +444,8 @@ namespace BlackWxPlugin const CGridPoint gridPoint({}, position, cloudLayers, temperatureLayers, {}, windLayers, pressureAtMsl); m_weatherGrid.push_back(gridPoint); } + + return true; } void CWeatherDataGfs::findNextGribMessage(unsigned char *buffer, g2int size, g2int iseek, g2int *lskip, g2int *lgrib) diff --git a/src/plugins/weatherdata/gfs/weatherdatagfs.h b/src/plugins/weatherdata/gfs/weatherdatagfs.h index 8f9ecce58..9ee28027e 100644 --- a/src/plugins/weatherdata/gfs/weatherdatagfs.h +++ b/src/plugins/weatherdata/gfs/weatherdatagfs.h @@ -68,7 +68,7 @@ namespace BlackWxPlugin void parseGfsFile(QNetworkReply *nwReplyPtr); BlackMisc::Network::CUrl getDownloadUrl() const; - void parseGfsFileImpl(const QByteArray &gribData); + bool parseGfsFileImpl(const QByteArray &gribData); void findNextGribMessage(unsigned char *buffer, g2int size, g2int iseek, g2int *lskip, g2int *lgrib); void createWeatherGrid(const gribfield *gfld); void handleProductDefinitionTemplate40(const gribfield *gfld);