From 683c66d81898e1d7d4cb814a5740169529c3313e Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Mon, 19 Sep 2022 18:26:36 -0400 Subject: Scanning can now be cancelled. Fix terminate() of thread pool blocking if wait() is already called. --- qdeduper/filescanner.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'qdeduper/filescanner.cpp') diff --git a/qdeduper/filescanner.cpp b/qdeduper/filescanner.cpp index e7e45fc..141cfbf 100644 --- a/qdeduper/filescanner.cpp +++ b/qdeduper/filescanner.cpp @@ -6,9 +6,8 @@ using std::size_t; -FileScanner::FileScanner() : QObject(nullptr), maxmnlen(0) +FileScanner::FileScanner() : QObject(nullptr), maxmnlen(0), interrpt(false) { - } void FileScanner::add_magic_number(const std::string &m) @@ -24,9 +23,13 @@ void FileScanner::add_path(const fs::path &p, bool recurse) } template -void dirit_foreach(T iter, std::function f) +void dirit_foreach(T iter, std::function f, std::atomic *inter) { - std::for_each(fs::begin(iter), fs::end(iter), f); + for(auto &e : iter) + { + if (inter->load()) break; + f(e); + } } void FileScanner::scan() @@ -57,18 +60,29 @@ void FileScanner::scan() bool recurse; std::tie(p, recurse) = pe; if (recurse) - dirit_foreach(fs::recursive_directory_iterator(p, opt), f); + dirit_foreach(fs::recursive_directory_iterator(p, opt), f, &interrpt); else - dirit_foreach(fs::directory_iterator(p, opt), f); + dirit_foreach(fs::directory_iterator(p, opt), f, &interrpt); } }; for_all_paths(count_files); + if (interrpt.load()) return; Q_EMIT scan_done_prep(fcnt); fcnt = 0; for_all_paths(scan_file); } +void FileScanner::interrupt() +{ + interrpt.store(true); +} + +bool FileScanner::interrupted() +{ + return interrpt.load(); +} + std::vector FileScanner::file_list() { return ret; -- cgit v1.2.3