mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 18:10:05 +00:00
Use signals/slots to prevent QObject lifetime issues
This commit is contained in:
parent
9b90189566
commit
a47460842b
7 changed files with 125 additions and 41 deletions
|
|
@ -223,10 +223,18 @@ void MainWindow::on_actionOpen_triggered()
|
|||
{
|
||||
BOOST_LOG_TRIVIAL(info) << "Selected: " << file.toStdString();
|
||||
|
||||
manager::RadarProductManager::LoadFile(
|
||||
file.toStdString(),
|
||||
[=](std::shared_ptr<wsr88d::NexradFile> nexradFile)
|
||||
std::shared_ptr<request::NexradFileRequest> request =
|
||||
std::make_shared<request::NexradFileRequest>();
|
||||
|
||||
connect(
|
||||
request.get(),
|
||||
&request::NexradFileRequest::RequestComplete,
|
||||
this,
|
||||
[=](std::shared_ptr<request::NexradFileRequest> request)
|
||||
{
|
||||
std::shared_ptr<wsr88d::NexradFile> nexradFile =
|
||||
request->nexrad_file();
|
||||
|
||||
std::shared_ptr<wsr88d::Ar2vFile> level2File =
|
||||
std::dynamic_pointer_cast<wsr88d::Ar2vFile>(nexradFile);
|
||||
std::shared_ptr<wsr88d::Level3File> level3File =
|
||||
|
|
@ -250,8 +258,9 @@ void MainWindow::on_actionOpen_triggered()
|
|||
messageBox->setAttribute(Qt::WA_DeleteOnClose);
|
||||
messageBox->open();
|
||||
}
|
||||
},
|
||||
this);
|
||||
});
|
||||
|
||||
manager::RadarProductManager::LoadFile(file.toStdString(), request);
|
||||
});
|
||||
|
||||
dialog->open();
|
||||
|
|
|
|||
|
|
@ -28,9 +28,8 @@ static const std::string logPrefix_ =
|
|||
typedef std::function<std::shared_ptr<wsr88d::NexradFile>()>
|
||||
CreateNexradFileFunction;
|
||||
|
||||
static void LoadNexradFile(CreateNexradFileFunction load,
|
||||
FileLoadCompleteFunction onComplete,
|
||||
QObject* context);
|
||||
static void LoadNexradFile(CreateNexradFileFunction load,
|
||||
std::shared_ptr<request::NexradFileRequest> request);
|
||||
|
||||
static constexpr uint32_t NUM_RADIAL_GATES_0_5_DEGREE =
|
||||
common::MAX_0_5_DEGREE_RADIALS * common::MAX_DATA_MOMENT_GATES;
|
||||
|
|
@ -210,33 +209,29 @@ void RadarProductManager::Initialize()
|
|||
p->initialized_ = true;
|
||||
}
|
||||
|
||||
void RadarProductManager::LoadData(std::istream& is,
|
||||
FileLoadCompleteFunction onComplete,
|
||||
QObject* context)
|
||||
void RadarProductManager::LoadData(
|
||||
std::istream& is, std::shared_ptr<request::NexradFileRequest> request)
|
||||
{
|
||||
LoadNexradFile(
|
||||
[=, &is]() -> std::shared_ptr<wsr88d::NexradFile> {
|
||||
return wsr88d::NexradFileFactory::Create(is);
|
||||
},
|
||||
onComplete,
|
||||
context);
|
||||
request);
|
||||
}
|
||||
|
||||
void RadarProductManager::LoadFile(const std::string& filename,
|
||||
FileLoadCompleteFunction onComplete,
|
||||
QObject* context)
|
||||
void RadarProductManager::LoadFile(
|
||||
const std::string& filename,
|
||||
std::shared_ptr<request::NexradFileRequest> request)
|
||||
{
|
||||
LoadNexradFile(
|
||||
[=]() -> std::shared_ptr<wsr88d::NexradFile> {
|
||||
return wsr88d::NexradFileFactory::Create(filename);
|
||||
},
|
||||
onComplete,
|
||||
context);
|
||||
request);
|
||||
}
|
||||
|
||||
static void LoadNexradFile(CreateNexradFileFunction load,
|
||||
FileLoadCompleteFunction onComplete,
|
||||
QObject* context)
|
||||
static void LoadNexradFile(CreateNexradFileFunction load,
|
||||
std::shared_ptr<request::NexradFileRequest> request)
|
||||
{
|
||||
scwx::util::async(
|
||||
[=]()
|
||||
|
|
@ -249,17 +244,10 @@ static void LoadNexradFile(CreateNexradFileFunction load,
|
|||
|
||||
lock.unlock();
|
||||
|
||||
if (onComplete != nullptr)
|
||||
if (request != nullptr)
|
||||
{
|
||||
if (context == nullptr)
|
||||
{
|
||||
onComplete(nexradFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
QMetaObject::invokeMethod(context,
|
||||
[=]() { onComplete(nexradFile); });
|
||||
}
|
||||
request->set_nexrad_file(nexradFile);
|
||||
emit request->RequestComplete(request);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <scwx/common/types.hpp>
|
||||
#include <scwx/qt/config/radar_site.hpp>
|
||||
#include <scwx/qt/request/nexrad_file_request.hpp>
|
||||
#include <scwx/wsr88d/ar2v_file.hpp>
|
||||
#include <scwx/wsr88d/level3_file.hpp>
|
||||
|
||||
|
|
@ -17,9 +18,6 @@ namespace qt
|
|||
namespace manager
|
||||
{
|
||||
|
||||
typedef std::function<void(std::shared_ptr<wsr88d::NexradFile>)>
|
||||
FileLoadCompleteFunction;
|
||||
|
||||
class RadarProductManagerImpl;
|
||||
|
||||
class RadarProductManager : public QObject
|
||||
|
|
@ -49,12 +47,12 @@ public:
|
|||
static std::shared_ptr<RadarProductManager>
|
||||
Instance(const std::string& radarSite);
|
||||
|
||||
static void LoadData(std::istream& is,
|
||||
FileLoadCompleteFunction onComplete,
|
||||
QObject* context = nullptr);
|
||||
static void LoadFile(const std::string& filename,
|
||||
FileLoadCompleteFunction onComplete,
|
||||
QObject* context = nullptr);
|
||||
static void
|
||||
LoadData(std::istream& is,
|
||||
std::shared_ptr<request::NexradFileRequest> request = nullptr);
|
||||
static void
|
||||
LoadFile(const std::string& filename,
|
||||
std::shared_ptr<request::NexradFileRequest> request = nullptr);
|
||||
|
||||
signals:
|
||||
void Level2DataLoaded();
|
||||
|
|
|
|||
44
scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp
Normal file
44
scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#include <scwx/qt/request/nexrad_file_request.hpp>
|
||||
|
||||
#include <boost/log/trivial.hpp>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace request
|
||||
{
|
||||
|
||||
static const std::string logPrefix_ =
|
||||
"[scwx::qt::request::nexrad_file_request] ";
|
||||
|
||||
class NexradFileRequestImpl
|
||||
{
|
||||
public:
|
||||
explicit NexradFileRequestImpl() : nexradFile_ {nullptr} {}
|
||||
|
||||
~NexradFileRequestImpl() {}
|
||||
|
||||
std::shared_ptr<wsr88d::NexradFile> nexradFile_;
|
||||
};
|
||||
|
||||
NexradFileRequest::NexradFileRequest() :
|
||||
p(std::make_unique<NexradFileRequestImpl>())
|
||||
{
|
||||
}
|
||||
NexradFileRequest::~NexradFileRequest() = default;
|
||||
|
||||
std::shared_ptr<wsr88d::NexradFile> NexradFileRequest::nexrad_file() const
|
||||
{
|
||||
return p->nexradFile_;
|
||||
}
|
||||
|
||||
void NexradFileRequest::set_nexrad_file(
|
||||
std::shared_ptr<wsr88d::NexradFile> nexradFile)
|
||||
{
|
||||
p->nexradFile_ = nexradFile;
|
||||
}
|
||||
|
||||
} // namespace request
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
39
scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp
Normal file
39
scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#pragma once
|
||||
|
||||
#include <scwx/wsr88d/nexrad_file.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace request
|
||||
{
|
||||
|
||||
class NexradFileRequestImpl;
|
||||
|
||||
class NexradFileRequest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit NexradFileRequest();
|
||||
~NexradFileRequest();
|
||||
|
||||
std::shared_ptr<wsr88d::NexradFile> nexrad_file() const;
|
||||
|
||||
void set_nexrad_file(std::shared_ptr<wsr88d::NexradFile> nexradFile);
|
||||
|
||||
private:
|
||||
std::unique_ptr<NexradFileRequestImpl> p;
|
||||
|
||||
signals:
|
||||
void RequestComplete(std::shared_ptr<NexradFileRequest> request);
|
||||
};
|
||||
|
||||
} // namespace request
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
Loading…
Add table
Add a link
Reference in a new issue