#pragma once #include #include #include #include #include #include #include #include class TaskManager { public: TaskManager(); ~TaskManager(); void start(); void queueJob(const std::string& source, const std::string& destination); void stop(); bool busy() const; void wait(); void printProgress() const; private: void loop(); bool loopCondition() const; bool waitCondition() const; static bool job(const std::string& source, const std::string& destination); private: std::atomic busyThreads; std::atomic maxTasks; std::atomic completeTasks; bool terminate; mutable std::mutex queueMutex; std::mutex busyMutex; std::condition_variable loopConditional; std::condition_variable waitConditional; std::vector threads; std::queue> jobs; std::function boundLoopCondition; std::function boundWaitCondition; };