Add progress report back.

This commit is contained in:
ZehMatt 2018-04-24 12:58:57 +02:00 committed by Aaron van Geffen
parent bee0fc25b1
commit 64d9109226
2 changed files with 28 additions and 13 deletions

View File

@ -242,7 +242,11 @@ private:
std::ref(printLock)));
}
jobPool.join();
jobPool.join([&]()
{
size_t completed = totalCount - jobPool.countPending();
Console::WriteFormat("File %5d of %d, done %3d%%\r", completed, totalCount, completed / totalCount);
});
for (auto&& itr : containers)
{

View File

@ -33,8 +33,8 @@ private:
const std::function<void()> completionFn;
};
std::atomic_bool _shouldStop = false;
std::atomic<size_t> _processing = 0;
std::atomic_bool _shouldStop;
std::atomic<size_t> _processing;
std::vector<std::thread> _threads;
std::deque<TaskData_t> _pending;
std::deque<TaskData_t> _completed;
@ -47,6 +47,8 @@ private:
public:
JobPool()
{
_shouldStop = false;
_processing = 0;
for (size_t n = 0; n < std::thread::hardware_concurrency(); n++)
{
_threads.emplace_back(&JobPool::processQueue, this);
@ -83,17 +85,21 @@ public:
return addTask(workFn, nullptr);
}
void join()
void join(std::function<void()> reportFn = nullptr)
{
while (true)
{
unique_lock lock(_mutex);
_condComplete.wait(lock, [this]()
{
return (_pending.empty() && _processing == 0) ||
(_completed.empty() == false);
return (_pending.empty() && _processing == 0) || !_completed.empty();
});
if (reportFn)
{
reportFn();
}
if (_completed.empty() &&
_pending.empty() &&
_processing == 0)
@ -106,15 +112,23 @@ public:
auto taskData = _completed.front();
_completed.pop_front();
lock.unlock();
if (taskData.completionFn)
{
lock.unlock();
taskData.completionFn();
taskData.completionFn();
lock.lock();
lock.lock();
}
}
}
}
size_t countPending()
{
return _pending.size();
}
private:
void processQueue()
{
@ -137,10 +151,7 @@ private:
lock.lock();
if (taskData.completionFn)
{
_completed.push_back(taskData);
}
_completed.push_back(taskData);
_processing--;
_condComplete.notify_one();