diff --git a/czkawka_core/src/bad_extensions.rs b/czkawka_core/src/bad_extensions.rs index fa97eeb..7758ff3 100644 --- a/czkawka_core/src/bad_extensions.rs +++ b/czkawka_core/src/bad_extensions.rs @@ -242,7 +242,7 @@ impl BadExtensions { 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 let progress_thread_run = Arc::new(AtomicBool::new(true)); @@ -281,7 +281,7 @@ impl BadExtensions { .map(|file_entry| { atomic_file_counter.fetch_add(1, Ordering::Relaxed); 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; } @@ -377,7 +377,7 @@ impl BadExtensions { progress_thread_handle.join().unwrap(); // Break if stop was clicked - if check_was_breaked.load(Ordering::Relaxed) { + if check_was_stopped.load(Ordering::Relaxed) { return false; } diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index 79f9525..72ef14e 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -391,9 +391,9 @@ impl BrokenFiles { 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 + 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 atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -425,7 +425,7 @@ impl BrokenFiles { .map(|(_, mut file_entry)| { atomic_file_counter.fetch_add(1, Ordering::Relaxed); 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; } @@ -493,26 +493,16 @@ impl BrokenFiles { progress_thread_run.store(false, Ordering::Relaxed); 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 for (_name, file_entry) in records_already_cached { 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 { // Must save all results to file, old loaded from file with all currently counted results let mut all_results: BTreeMap = 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); } 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); } + // 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(); Common::print_time(system_time, SystemTime::now(), "sort_images - reading data from files in parallel".to_string()); diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 3726856..76372c2 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -504,7 +504,7 @@ impl DuplicateFinder { let check_type = Arc::new(self.hash_type); 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> = Default::default(); //// PROGRESS THREAD START @@ -597,7 +597,7 @@ impl DuplicateFinder { atomic_file_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed); for file_entry in vec_file_entry { 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; } match hash_calculation(&mut buffer, file_entry, &check_type, 0) { @@ -618,7 +618,7 @@ impl DuplicateFinder { progress_thread_handle.join().unwrap(); // Check if user aborted search(only from GUI) - if check_was_breaked.load(Ordering::Relaxed) { + if check_was_stopped.load(Ordering::Relaxed) { return false; } @@ -761,7 +761,7 @@ impl DuplicateFinder { atomic_file_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed); for mut file_entry in vec_file_entry { 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; } @@ -821,8 +821,8 @@ impl DuplicateFinder { progress_thread_run.store(false, Ordering::Relaxed); progress_thread_handle.join().unwrap(); - // Check if user aborted search(only from GUI) - if check_was_breaked.load(Ordering::Relaxed) { + // Break if stop was clicked after saving to cache + if check_was_stopped.load(Ordering::Relaxed) { return false; } diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 2789636..96f8ffc 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -320,7 +320,7 @@ impl SameMusic { 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 let progress_thread_run = Arc::new(AtomicBool::new(true)); @@ -358,7 +358,7 @@ impl SameMusic { .map(|(path, mut music_entry)| { atomic_file_counter.fetch_add(1, Ordering::Relaxed); 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; } @@ -456,11 +456,6 @@ impl SameMusic { progress_thread_run.store(false, Ordering::Relaxed); 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 for (_name, file_entry) in records_already_cached { 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); } + // 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()); true diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index b29f420..4c9a6d3 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -535,6 +535,7 @@ impl SimilarImages { let hash_map_modification = SystemTime::now(); //// 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 atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -568,6 +569,7 @@ impl SimilarImages { .map(|(_s, mut file_entry)| { atomic_file_counter.fetch_add(1, Ordering::Relaxed); if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { + check_was_stopped.store(true, Ordering::Relaxed); return None; } 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()); true } diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index 05583d9..9bacfbe 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -464,6 +464,7 @@ impl SimilarVideos { let hash_map_modification = SystemTime::now(); //// 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 atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -496,7 +497,7 @@ impl SimilarVideos { .map(|file_entry| { atomic_file_counter.fetch_add(1, Ordering::Relaxed); 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; } 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); } + // 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()); let hash_map_modification = SystemTime::now();