From bb7793d3093ed1a409c38f096b3543a7af26fcf5 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 28 May 2022 14:37:39 -0500 Subject: [PATCH] Use boost::asio for asynchronous processing --- scwx-qt/source/scwx/qt/main/main.cpp | 36 ++++++++++++++++++++++++++++ wxdata/include/scwx/util/threads.hpp | 8 ++++--- wxdata/source/scwx/util/threads.cpp | 15 ++++++++++++ wxdata/wxdata.cmake | 1 + 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 wxdata/source/scwx/util/threads.cpp diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index 528d2f48..422d464b 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -3,30 +3,66 @@ #include #include #include +#include #include +#include #include #include +static const std::string logPrefix_ = "scwx::main"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + int main(int argc, char* argv[]) { + // Initialize logger scwx::util::Logger::Initialize(); spdlog::set_level(spdlog::level::debug); QCoreApplication::setApplicationName("Supercell Wx"); + // Start the io_context main loop + boost::asio::io_context& ioContext = scwx::util::io_context(); + auto work = boost::asio::make_work_guard(ioContext); + boost::asio::thread_pool threadPool {4}; + boost::asio::post(threadPool, + [&]() + { + while (true) + { + try + { + ioContext.run(); + break; // run() exited normally + } + catch (std::exception& ex) + { + // Log exception and continue + logger_->error(ex.what()); + } + } + }); + + // Initialize AWS SDK Aws::SDKOptions awsSdkOptions; Aws::InitAPI(awsSdkOptions); + // Initialize application scwx::qt::config::RadarSite::Initialize(); scwx::qt::manager::SettingsManager::Initialize(); scwx::qt::manager::ResourceManager::PreLoad(); + // Run Qt main loop QApplication a(argc, argv); scwx::qt::main::MainWindow w; w.show(); int result = a.exec(); + // Gracefully stop the io_context main loop + work.reset(); + threadPool.join(); + + // Shutdown AWS SDK Aws::ShutdownAPI(awsSdkOptions); return result; diff --git a/wxdata/include/scwx/util/threads.hpp b/wxdata/include/scwx/util/threads.hpp index ef0a5cb0..441105b6 100644 --- a/wxdata/include/scwx/util/threads.hpp +++ b/wxdata/include/scwx/util/threads.hpp @@ -1,15 +1,17 @@ -#include +#include +#include namespace scwx { namespace util { +boost::asio::io_context& io_context(); + template void async(F&& f) { - auto future = std::make_shared>(); - *future = std::async(std::launch::async, [future, f]() { f(); }); + boost::asio::post(io_context(), f); } } // namespace util diff --git a/wxdata/source/scwx/util/threads.cpp b/wxdata/source/scwx/util/threads.cpp new file mode 100644 index 00000000..2b179c36 --- /dev/null +++ b/wxdata/source/scwx/util/threads.cpp @@ -0,0 +1,15 @@ +#include + +namespace scwx +{ +namespace util +{ + +boost::asio::io_context& io_context() +{ + static boost::asio::io_context ioContext {}; + return ioContext; +} + +} // namespace util +} // namespace scwx diff --git a/wxdata/wxdata.cmake b/wxdata/wxdata.cmake index 50a40872..ee41fba6 100644 --- a/wxdata/wxdata.cmake +++ b/wxdata/wxdata.cmake @@ -54,6 +54,7 @@ set(SRC_UTIL source/scwx/util/float.cpp source/scwx/util/rangebuf.cpp source/scwx/util/streams.cpp source/scwx/util/time.cpp + source/scwx/util/threads.cpp source/scwx/util/vectorbuf.cpp) set(HDR_WSR88D include/scwx/wsr88d/ar2v_file.hpp include/scwx/wsr88d/level3_file.hpp