From 1c50d4d7790ffb217878f0feb35a035b2bcb482c Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 23 Oct 2024 02:01:34 +0300 Subject: [PATCH] added multithreading --- src/Regex.cpp | 26 ++++++++++++++++++-------- src/includes/Regex.hpp | 10 ++++------ src/maincommand.cpp | 21 ++++++++++----------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/Regex.cpp b/src/Regex.cpp index d9bc249..3145216 100644 --- a/src/Regex.cpp +++ b/src/Regex.cpp @@ -52,9 +52,9 @@ void Regex(cmd *inputCmd) { } } -void filerestort(cmd *inputCmd) { - std::filesystem::path steamdir = std::string(inputCmd->userHome) + "/.cache/steamapps/workshop/content/" + inputCmd->gameid + "/" + inputCmd->idnumber; - std::filesystem::path modname = inputCmd->dir + "/" + inputCmd->idname; +void filerestort(cmd *inputCmd, std::string idnumber, std::string idname) { + std::filesystem::path steamdir = std::string(inputCmd->userHome) + "/.cache/steamapps/workshop/content/" + inputCmd->gameid + "/" + idnumber; + std::filesystem::path modname = inputCmd->dir + "/" + idname; // renames and moves the files. try { @@ -63,29 +63,38 @@ void filerestort(cmd *inputCmd) { std::filesystem::remove_all(modname); } std::filesystem::rename(steamdir, modname); + inputCmd->threadsCompleted++; } else { std::cerr << "Error: The directory " << steamdir << " does not exist." << std::endl; + inputCmd->threadsCompleted++; + } } catch (const std::filesystem::filesystem_error& e) { std::cerr << "Filesystem error: " << e.what() << std::endl; + inputCmd->threadsCompleted++; + } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; + inputCmd->threadsCompleted++; + } } -void Modname(cmd *inputCmd, std::string input) { +void Modname(cmd *inputCmd, size_t index) { + std::string idnumber; + std::string idname; if (!inputCmd->sucids.empty()) { std::regex downloadItemRegex(R"(Downloaded item (\d+))"); std::smatch match; - if (std::regex_search(input, match, downloadItemRegex)) { + if (std::regex_search(inputCmd->sucids[index], match, downloadItemRegex)) { std::string downloadItemNumber = match[1].str(); - inputCmd->idnumber = downloadItemNumber; + idnumber = downloadItemNumber; } std::istringstream inputStream(inputCmd->source); - std::regex grepRegex("\"id\":\"" + inputCmd->idnumber + "\",\"title\":\""); + std::regex grepRegex("\"id\":\"" + idnumber + "\",\"title\":\""); std::string line; while (std::getline(inputStream, line)) { @@ -103,8 +112,9 @@ void Modname(cmd *inputCmd, std::string input) { line = line.substr(idPos + idPrefix.length()); // Keep everything after "id=" } - inputCmd->idname = line; + idname = line; } } + filerestort(inputCmd, idnumber, idname); } } diff --git a/src/includes/Regex.hpp b/src/includes/Regex.hpp index ce31c53..fab1499 100644 --- a/src/includes/Regex.hpp +++ b/src/includes/Regex.hpp @@ -1,7 +1,7 @@ #ifndef REGEX_H #define REGEX_H #include - +#include // all the var's struct cmd { const char* userHome = getenv("HOME"); @@ -24,17 +24,15 @@ int slashtp = 0; std::string slash; // counter -std::string sucids; -std::string idnumber; -std::string idname; +std::vector sucids; int successes = 0; int timedout = 0; int errors = 0; int totalmeow = 0; +size_t threadsCompleted = 0; }; void Regex(cmd *inputCmd); -void filerestort(cmd *inputCmd); -void Modname(cmd *inputCmd, std::string input); +void Modname(cmd *inputCmd, size_t index); #endif diff --git a/src/maincommand.cpp b/src/maincommand.cpp index 2a970dc..5514600 100644 --- a/src/maincommand.cpp +++ b/src/maincommand.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -24,7 +23,8 @@ void execAndDisplay(cmd *inputCmd, const std::string& cmd, std::atomic& ru // checks for success. if (line.find("Success") != std::string::npos) { inputCmd->successes++; - inputCmd->sucids += line + "\n"; + inputCmd->sucids.push_back( line + "\n"); + std::cout << "pushed success to array\n"; } // checks for timed out ones. @@ -93,15 +93,14 @@ void maincommand(cmd *inputCmd) { + "Timed out: " + std::to_string(inputCmd->timedout) + "\n" + "Errored: " + std::to_string(inputCmd->errors) + "\n" + "\n"; - // mod names - std::istringstream inputStream(inputCmd->sucids); - std::string line; - - while (std::getline(inputStream, line)) { - inputCmd->slashtp++; - Modname(inputCmd, line); - filerestort(inputCmd); + //start the threads + for(size_t nya{0}; nya < inputCmd->sucids.size(); ++nya){ + inputCmd->slashtp++; + std::thread meowT {Modname, inputCmd, nya}; + meowT.detach(); } - + std::cout << "waiting for threads to finish >.<\n"; + while(inputCmd->threadsCompleted != inputCmd->sucids.size()){} + std::cout << "threads finished!\n"; std::cout << "\n\n" + mods + colm + " has been downloaded too: " + inputCmd->dir + "\n"; }