From b9d939b294ab6691acbfec290992ed94401f2878 Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 24 Apr 2018 21:36:28 +0200 Subject: [PATCH] Show progress of processed elements instead of pending tasks. --- src/openrct2/core/FileIndex.hpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/openrct2/core/FileIndex.hpp b/src/openrct2/core/FileIndex.hpp index 7fb12390cc..d2017f7aa4 100644 --- a/src/openrct2/core/FileIndex.hpp +++ b/src/openrct2/core/FileIndex.hpp @@ -184,6 +184,7 @@ private: size_t rangeStart, size_t rangeEnd, std::vector& items, + std::atomic& processed, std::mutex& printLock) const { items.reserve(rangeEnd - rangeStart); @@ -202,6 +203,8 @@ private: { items.push_back(std::get<1>(item)); } + + processed++; } } @@ -222,28 +225,36 @@ private: size_t stepSize = 100; // Handpicked, seems to work well with 4/8 cores. + std::atomic processed = ATOMIC_VAR_INIT(0); + + auto reportProgress = [&]() + { + const size_t completed = processed; + Console::WriteFormat("File %5d of %d, done %3d%%\r", completed, totalCount, completed * 100 / totalCount); + }; + for (size_t rangeStart = 0; rangeStart < totalCount; rangeStart += stepSize) { if (rangeStart + stepSize > totalCount) stepSize = totalCount - rangeStart; + // TODO: change to auto& items = containers.emplace_back() in C++17 containers.emplace_back(); auto& items = containers.back(); - jobPool.addTask(std::bind(&FileIndex::BuildRange, + jobPool.AddTask(std::bind(&FileIndex::BuildRange, this, std::cref(scanResult), rangeStart, rangeStart + stepSize, std::ref(items), + std::ref(processed), std::ref(printLock))); + + reportProgress(); } - jobPool.join([&]() - { - size_t completed = totalCount - jobPool.countPending(); - Console::WriteFormat("File %5d of %d, done %3d%%\r", completed, totalCount, completed * 100 / totalCount); - }); + jobPool.Join(reportProgress); for (auto&& itr : containers) {