From 6f89e0f052678b20a9cb70d5cde5c5ab45ac63b3 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Wed, 31 Aug 2016 18:12:31 +0200 Subject: [PATCH] --- src/Components/Modules/Download.cpp | 11 ++++++++++- src/Components/Modules/Download.hpp | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Components/Modules/Download.cpp b/src/Components/Modules/Download.cpp index ee97c5df..8b9fae2c 100644 --- a/src/Components/Modules/Download.cpp +++ b/src/Components/Modules/Download.cpp @@ -19,6 +19,7 @@ namespace Components Download::CLDownload.Running = true; Download::CLDownload.Mod = mod; + Download::CLDownload.TerminateThread = false; Download::CLDownload.Target = Party::Target(); Download::CLDownload.Thread = std::thread(Download::ModDownloader, &Download::CLDownload); } @@ -125,7 +126,7 @@ namespace Components mg_mgr_init(&download->Mgr, &fDownload); mg_connect_http(&download->Mgr, Download::DownloadHandler, url.data(), NULL, NULL); - while (fDownload.downloading) + while (fDownload.downloading && !fDownload.download->TerminateThread) { mg_mgr_poll(&download->Mgr, 0); } @@ -164,6 +165,8 @@ namespace Components return; } + if (download->TerminateThread) return; + if (!Download::ParseModList(download, list)) { download->Thread.detach(); @@ -177,8 +180,12 @@ namespace Components return; } + if (download->TerminateThread) return; + for (unsigned int i = 0; i < download->Files.size(); ++i) { + if (download->TerminateThread) return; + if (!Download::DownloadFile(download, i)) { Dvar::Var("partyend_reason").Set(fmt::sprintf("Failed to download file: %s!", download->Files[i].Name.data())); @@ -197,6 +204,8 @@ namespace Components } } + if (download->TerminateThread) return; + static std::string mod = download->Mod; download->Thread.detach(); diff --git a/src/Components/Modules/Download.hpp b/src/Components/Modules/Download.hpp index 11748aa7..f0f97266 100644 --- a/src/Components/Modules/Download.hpp +++ b/src/Components/Modules/Download.hpp @@ -16,11 +16,12 @@ namespace Components class ClientDownload { public: - ClientDownload() : Valid(false), Running(false) {} + ClientDownload() : Valid(false), Running(false), TerminateThread(false) {} ~ClientDownload() { this->Clear(); } bool Running; bool Valid; + bool TerminateThread; mg_mgr Mgr; Network::Address Target; std::string Mod; @@ -28,6 +29,7 @@ namespace Components std::thread Thread; std::string Progress; + class File { public: @@ -40,6 +42,13 @@ namespace Components void Clear() { + this->TerminateThread = true; + + if (this->Thread.joinable()) + { + this->Thread.join(); + } + this->Running = false; this->Mod.clear(); this->Files.clear();