// // Created by versustune on 24.02.20. // #include "ThreadPool.h" #include "../Utils/Logging.h" #include "ThreadSafeDeque.h" #include #include #include void ThreadPool::setQueue(Tsqueue> *queue) { ThreadPool::threadQueue = queue; } void ThreadPool::initThreads() { threadCount = std::thread::hardware_concurrency(); std::stringstream stream; stream << "Create Threadpool with " << threadCount << " threads"; Logging::log(stream.str().c_str(), "ThreadPool"); threads.resize(threadCount); threads.clear(); finishedThreads.clear(); for (int i = 0; i < threadCount; ++i) { threads[i] = new std::thread(&ThreadPool::execute, this, i); threads[i]->detach(); } } void ThreadPool::start(ProgressBar *progressBar) { initThreads(); progressBar->startThread(); while (finishedThreads.size() < threadCount) { //wait for threads to finish std::this_thread::sleep_for(std::chrono::microseconds(1000)); } progressBar->update(); } void ThreadPool::execute(int threadNumber) { //if queue empty terminate Thread... make no sense ;) if (threadQueue->getSize() < 1) { return; } while (auto queueItem = threadQueue->pop()) { auto item = queueItem.value(); if (item == nullptr) { continue; } auto file = item->reader->files[item->fileIndex]; auto wait = 10000L+(long)((1e5-1e4)*random()/(RAND_MAX+1.0)); usleep(wait); //do your job here! item->progressBar->tick(); } finishedThreads.push_back(threadNumber + 1); }