#pragma once #include #include #include #include #include #include #include #include #include #include #include #include "loggable.h" class TaskManager { typedef std::pair> JobResult; 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; void printProgress(const JobResult& result, const std::string& source, const std::string& destination) const; private: void loop(); bool loopCondition() const; bool waitCondition() const; static JobResult job(const std::string& source, const std::string& destination); static void printLog(const JobResult& result, const std::string& source, const std::string& destination); private: std::atomic busyThreads; std::atomic maxTasks; std::atomic completeTasks; bool terminate; mutable std::mutex printMutex; 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; };