diff --git a/src/MaaCore/Assistant.cpp b/src/MaaCore/Assistant.cpp index 3c97c653ac..fb7944d41a 100644 --- a/src/MaaCore/Assistant.cpp +++ b/src/MaaCore/Assistant.cpp @@ -5,6 +5,7 @@ #include #include "Config/GeneralConfig.h" +#include "Config/ResourceLoader.h" #include "Controller/Controller.h" #include "Status.h" #include "Task/Interface/AwardTask.h" @@ -52,6 +53,10 @@ Assistant::~Assistant() { LogTraceFunction; + // dirty stuff preventing Logger from being destructed before ResourceLoader::load_thread_func exits, + // which creates empty files with random name on Linux. I have no idea how this could work + ResourceLoader::get_instance().cancel(); + m_thread_exit = true; m_thread_idle = true; diff --git a/src/MaaCore/Config/ResourceLoader.cpp b/src/MaaCore/Config/ResourceLoader.cpp index b5bc205f5e..0bc988acd0 100644 --- a/src/MaaCore/Config/ResourceLoader.cpp +++ b/src/MaaCore/Config/ResourceLoader.cpp @@ -57,7 +57,7 @@ void asst::ResourceLoader::add_load_queue(AbstractResource& res, const std::file m_load_cv.notify_all(); } -asst::ResourceLoader::~ResourceLoader() +void asst::ResourceLoader::cancel() { m_load_thread_exit = true; @@ -71,6 +71,11 @@ asst::ResourceLoader::~ResourceLoader() } } +asst::ResourceLoader::~ResourceLoader() +{ + cancel(); +} + bool asst::ResourceLoader::load(const std::filesystem::path& path) { if (!std::filesystem::exists(path)) { diff --git a/src/MaaCore/Config/ResourceLoader.h b/src/MaaCore/Config/ResourceLoader.h index da461a3f8b..b33aad80de 100644 --- a/src/MaaCore/Config/ResourceLoader.h +++ b/src/MaaCore/Config/ResourceLoader.h @@ -23,6 +23,8 @@ namespace asst public: ResourceLoader(); + void cancel(); + private: void load_thread_func();