#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include "settings.h" #include "logger/printer.h" class TaskManager { typedef std::pair> JobResult; public: TaskManager(const std::shared_ptr& settings, const std::shared_ptr& logger); ~TaskManager(); void start(); void queueJob(const std::filesystem::path& source, const std::filesystem::path& destination); void stop(); bool busy() const; void wait(); unsigned int getCompleteTasks() const; private: void loop(); static JobResult mp3Job(const std::filesystem::path& source, const std::filesystem::path& destination, Logger::Severity logLevel); private: std::shared_ptr settings; std::shared_ptr logger; unsigned int busyThreads; unsigned int maxTasks; unsigned int completeTasks; bool terminate; bool running; mutable std::mutex queueMutex; std::condition_variable loopConditional; std::condition_variable waitConditional; std::vector threads; std::queue> jobs; };