aboutsummaryrefslogtreecommitdiff
path: root/qdeduper/filescanner.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-19 18:26:36 -0400
committerGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-19 18:27:15 -0400
commit683c66d81898e1d7d4cb814a5740169529c3313e (patch)
tree2bd09916fce34141b3ce00822f816485fe1cc8dd /qdeduper/filescanner.cpp
parent817075ec9bd6bd656a4a6dc23363e950474b21d5 (diff)
downloaddeduper-683c66d81898e1d7d4cb814a5740169529c3313e.tar.xz
Scanning can now be cancelled.
Fix terminate() of thread pool blocking if wait() is already called.
Diffstat (limited to 'qdeduper/filescanner.cpp')
-rw-r--r--qdeduper/filescanner.cpp26
1 files changed, 20 insertions, 6 deletions
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 <class T>
-void dirit_foreach(T iter, std::function<void(const fs::directory_entry& p)> f)
+void dirit_foreach(T iter, std::function<void(const fs::directory_entry& p)> f, std::atomic<bool> *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<fs::path> FileScanner::file_list()
{
return ret;