Saves results when stopping scan (#713)
This commit is contained in:
parent
637e97e66d
commit
073ae6f72f
|
@ -242,7 +242,7 @@ impl BadExtensions {
|
||||||
|
|
||||||
let include_files_without_extension = self.include_files_without_extension;
|
let include_files_without_extension = self.include_files_without_extension;
|
||||||
|
|
||||||
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
||||||
|
|
||||||
//// PROGRESS THREAD START
|
//// PROGRESS THREAD START
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
|
@ -281,7 +281,7 @@ impl BadExtensions {
|
||||||
.map(|file_entry| {
|
.map(|file_entry| {
|
||||||
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
check_was_breaked.store(true, Ordering::Relaxed);
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ impl BadExtensions {
|
||||||
progress_thread_handle.join().unwrap();
|
progress_thread_handle.join().unwrap();
|
||||||
|
|
||||||
// Break if stop was clicked
|
// Break if stop was clicked
|
||||||
if check_was_breaked.load(Ordering::Relaxed) {
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -391,9 +391,9 @@ impl BrokenFiles {
|
||||||
mem::swap(&mut self.files_to_check, &mut non_cached_files_to_check);
|
mem::swap(&mut self.files_to_check, &mut non_cached_files_to_check);
|
||||||
}
|
}
|
||||||
|
|
||||||
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
|
||||||
|
|
||||||
//// PROGRESS THREAD START
|
//// PROGRESS THREAD START
|
||||||
|
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
|
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
|
||||||
|
|
||||||
|
@ -425,7 +425,7 @@ impl BrokenFiles {
|
||||||
.map(|(_, mut file_entry)| {
|
.map(|(_, mut file_entry)| {
|
||||||
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
check_was_breaked.store(true, Ordering::Relaxed);
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,26 +493,16 @@ impl BrokenFiles {
|
||||||
progress_thread_run.store(false, Ordering::Relaxed);
|
progress_thread_run.store(false, Ordering::Relaxed);
|
||||||
progress_thread_handle.join().unwrap();
|
progress_thread_handle.join().unwrap();
|
||||||
|
|
||||||
// Break if stop was clicked
|
|
||||||
if check_was_breaked.load(Ordering::Relaxed) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Just connect loaded results with already calculated
|
// Just connect loaded results with already calculated
|
||||||
for (_name, file_entry) in records_already_cached {
|
for (_name, file_entry) in records_already_cached {
|
||||||
vec_file_entry.push(file_entry.clone());
|
vec_file_entry.push(file_entry.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
self.broken_files = vec_file_entry
|
|
||||||
.iter()
|
|
||||||
.filter_map(|f| if f.error_string.is_empty() { None } else { Some(f.clone()) })
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
if self.use_cache {
|
if self.use_cache {
|
||||||
// Must save all results to file, old loaded from file with all currently counted results
|
// Must save all results to file, old loaded from file with all currently counted results
|
||||||
let mut all_results: BTreeMap<String, FileEntry> = self.files_to_check.clone();
|
let mut all_results: BTreeMap<String, FileEntry> = self.files_to_check.clone();
|
||||||
|
|
||||||
for file_entry in vec_file_entry {
|
for file_entry in vec_file_entry.clone() {
|
||||||
all_results.insert(file_entry.path.to_string_lossy().to_string(), file_entry);
|
all_results.insert(file_entry.path.to_string_lossy().to_string(), file_entry);
|
||||||
}
|
}
|
||||||
for (_name, file_entry) in loaded_hash_map {
|
for (_name, file_entry) in loaded_hash_map {
|
||||||
|
@ -521,6 +511,16 @@ impl BrokenFiles {
|
||||||
save_cache_to_file(&all_results, &mut self.text_messages, self.save_also_as_json);
|
save_cache_to_file(&all_results, &mut self.text_messages, self.save_also_as_json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Break if stop was clicked after saving to cache
|
||||||
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.broken_files = vec_file_entry
|
||||||
|
.into_par_iter()
|
||||||
|
.filter_map(|f| if f.error_string.is_empty() { None } else { Some(f) })
|
||||||
|
.collect();
|
||||||
|
|
||||||
self.information.number_of_broken_files = self.broken_files.len();
|
self.information.number_of_broken_files = self.broken_files.len();
|
||||||
|
|
||||||
Common::print_time(system_time, SystemTime::now(), "sort_images - reading data from files in parallel".to_string());
|
Common::print_time(system_time, SystemTime::now(), "sort_images - reading data from files in parallel".to_string());
|
||||||
|
|
|
@ -504,7 +504,7 @@ impl DuplicateFinder {
|
||||||
let check_type = Arc::new(self.hash_type);
|
let check_type = Arc::new(self.hash_type);
|
||||||
|
|
||||||
let start_time: SystemTime = SystemTime::now();
|
let start_time: SystemTime = SystemTime::now();
|
||||||
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
||||||
let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
|
let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
|
||||||
|
|
||||||
//// PROGRESS THREAD START
|
//// PROGRESS THREAD START
|
||||||
|
@ -597,7 +597,7 @@ impl DuplicateFinder {
|
||||||
atomic_file_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed);
|
atomic_file_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed);
|
||||||
for file_entry in vec_file_entry {
|
for file_entry in vec_file_entry {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
check_was_breaked.store(true, Ordering::Relaxed);
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
match hash_calculation(&mut buffer, file_entry, &check_type, 0) {
|
match hash_calculation(&mut buffer, file_entry, &check_type, 0) {
|
||||||
|
@ -618,7 +618,7 @@ impl DuplicateFinder {
|
||||||
progress_thread_handle.join().unwrap();
|
progress_thread_handle.join().unwrap();
|
||||||
|
|
||||||
// Check if user aborted search(only from GUI)
|
// Check if user aborted search(only from GUI)
|
||||||
if check_was_breaked.load(Ordering::Relaxed) {
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -761,7 +761,7 @@ impl DuplicateFinder {
|
||||||
atomic_file_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed);
|
atomic_file_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed);
|
||||||
for mut file_entry in vec_file_entry {
|
for mut file_entry in vec_file_entry {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
check_was_breaked.store(true, Ordering::Relaxed);
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,8 +821,8 @@ impl DuplicateFinder {
|
||||||
progress_thread_run.store(false, Ordering::Relaxed);
|
progress_thread_run.store(false, Ordering::Relaxed);
|
||||||
progress_thread_handle.join().unwrap();
|
progress_thread_handle.join().unwrap();
|
||||||
|
|
||||||
// Check if user aborted search(only from GUI)
|
// Break if stop was clicked after saving to cache
|
||||||
if check_was_breaked.load(Ordering::Relaxed) {
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -320,7 +320,7 @@ impl SameMusic {
|
||||||
mem::swap(&mut self.music_to_check, &mut non_cached_files_to_check);
|
mem::swap(&mut self.music_to_check, &mut non_cached_files_to_check);
|
||||||
}
|
}
|
||||||
|
|
||||||
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
||||||
|
|
||||||
//// PROGRESS THREAD START
|
//// PROGRESS THREAD START
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
|
@ -358,7 +358,7 @@ impl SameMusic {
|
||||||
.map(|(path, mut music_entry)| {
|
.map(|(path, mut music_entry)| {
|
||||||
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
check_was_breaked.store(true, Ordering::Relaxed);
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,11 +456,6 @@ impl SameMusic {
|
||||||
progress_thread_run.store(false, Ordering::Relaxed);
|
progress_thread_run.store(false, Ordering::Relaxed);
|
||||||
progress_thread_handle.join().unwrap();
|
progress_thread_handle.join().unwrap();
|
||||||
|
|
||||||
// Check if user aborted search(only from GUI)
|
|
||||||
if check_was_breaked.load(Ordering::Relaxed) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Just connect loaded results with already calculated
|
// Just connect loaded results with already calculated
|
||||||
for (_name, file_entry) in records_already_cached {
|
for (_name, file_entry) in records_already_cached {
|
||||||
vec_file_entry.push(file_entry.clone());
|
vec_file_entry.push(file_entry.clone());
|
||||||
|
@ -478,6 +473,11 @@ impl SameMusic {
|
||||||
save_cache_to_file(&all_results, &mut self.text_messages, self.save_also_as_json);
|
save_cache_to_file(&all_results, &mut self.text_messages, self.save_also_as_json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Break if stop was clicked after saving to cache
|
||||||
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Common::print_time(start_time, SystemTime::now(), "check_records_multithreaded".to_string());
|
Common::print_time(start_time, SystemTime::now(), "check_records_multithreaded".to_string());
|
||||||
|
|
||||||
true
|
true
|
||||||
|
|
|
@ -535,6 +535,7 @@ impl SimilarImages {
|
||||||
let hash_map_modification = SystemTime::now();
|
let hash_map_modification = SystemTime::now();
|
||||||
|
|
||||||
//// PROGRESS THREAD START
|
//// PROGRESS THREAD START
|
||||||
|
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
|
|
||||||
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
|
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
|
||||||
|
@ -568,6 +569,7 @@ impl SimilarImages {
|
||||||
.map(|(_s, mut file_entry)| {
|
.map(|(_s, mut file_entry)| {
|
||||||
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let file_name_lowercase = file_entry.path.to_string_lossy().to_lowercase();
|
let file_name_lowercase = file_entry.path.to_string_lossy().to_lowercase();
|
||||||
|
@ -669,6 +671,11 @@ impl SimilarImages {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Break if stop was clicked after saving to cache
|
||||||
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Common::print_time(hash_map_modification, SystemTime::now(), "sort_images - saving data to files".to_string());
|
Common::print_time(hash_map_modification, SystemTime::now(), "sort_images - saving data to files".to_string());
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -464,6 +464,7 @@ impl SimilarVideos {
|
||||||
let hash_map_modification = SystemTime::now();
|
let hash_map_modification = SystemTime::now();
|
||||||
|
|
||||||
//// PROGRESS THREAD START
|
//// PROGRESS THREAD START
|
||||||
|
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
|
|
||||||
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
|
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
|
||||||
|
@ -496,7 +497,7 @@ impl SimilarVideos {
|
||||||
.map(|file_entry| {
|
.map(|file_entry| {
|
||||||
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
// This will not break
|
check_was_stopped.store(true, Ordering::Relaxed);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let mut file_entry = file_entry.1.clone();
|
let mut file_entry = file_entry.1.clone();
|
||||||
|
@ -551,6 +552,11 @@ impl SimilarVideos {
|
||||||
save_hashes_to_file(&all_results, &mut self.text_messages, self.save_also_as_json);
|
save_hashes_to_file(&all_results, &mut self.text_messages, self.save_also_as_json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Break if stop was clicked after saving to cache
|
||||||
|
if check_was_stopped.load(Ordering::Relaxed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Common::print_time(hash_map_modification, SystemTime::now(), "sort_videos - saving data to files".to_string());
|
Common::print_time(hash_map_modification, SystemTime::now(), "sort_videos - saving data to files".to_string());
|
||||||
let hash_map_modification = SystemTime::now();
|
let hash_map_modification = SystemTime::now();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue