Simplifying thread run
This commit is contained in:
parent
3cbf6bf0c1
commit
cb32ad515d
|
@ -315,17 +315,7 @@ impl BadExtensions {
|
||||||
fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
self.files_to_check.len(),
|
|
||||||
CheckingMethod::None,
|
|
||||||
);
|
|
||||||
|
|
||||||
let files_to_check = mem::take(&mut self.files_to_check);
|
let files_to_check = mem::take(&mut self.files_to_check);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::fs;
|
||||||
use std::fs::{DirEntry, File, Metadata};
|
use std::fs::{DirEntry, File, Metadata};
|
||||||
use std::io::{BufWriter, Write};
|
use std::io::{BufWriter, Write};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::AtomicBool;
|
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
@ -148,9 +148,7 @@ impl BigFile {
|
||||||
folders_to_check.push(id.clone());
|
folders_to_check.push(id.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 0, 0, CheckingMethod::None);
|
|
||||||
|
|
||||||
while !folders_to_check.is_empty() {
|
while !folders_to_check.is_empty() {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::fs::{DirEntry, File, Metadata};
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::io::{BufReader, BufWriter};
|
use std::io::{BufReader, BufWriter};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use std::{fs, mem, panic};
|
use std::{fs, mem, panic};
|
||||||
|
@ -200,9 +200,7 @@ impl BrokenFiles {
|
||||||
folders_to_check.push(id.clone());
|
folders_to_check.push(id.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 1, 0, CheckingMethod::None);
|
|
||||||
|
|
||||||
while !folders_to_check.is_empty() {
|
while !folders_to_check.is_empty() {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
|
@ -437,17 +435,8 @@ impl BrokenFiles {
|
||||||
non_cached_files_to_check = files_to_check;
|
non_cached_files_to_check = files_to_check;
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) =
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None);
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
non_cached_files_to_check.len(),
|
|
||||||
CheckingMethod::None,
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut vec_file_entry: Vec<FileEntry> = non_cached_files_to_check
|
let mut vec_file_entry: Vec<FileEntry> = non_cached_files_to_check
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
|
|
|
@ -385,16 +385,17 @@ where
|
||||||
.collect::<Vec<(T, Vec<T>)>>()
|
.collect::<Vec<(T, Vec<T>)>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
pub fn prepare_thread_handler_common(
|
pub fn prepare_thread_handler_common(
|
||||||
progress_sender: Option<&UnboundedSender<ProgressData>>,
|
progress_sender: Option<&UnboundedSender<ProgressData>>,
|
||||||
progress_thread_run: &Arc<AtomicBool>,
|
|
||||||
atomic_counter: &Arc<AtomicUsize>,
|
|
||||||
current_stage: u8,
|
current_stage: u8,
|
||||||
max_stage: u8,
|
max_stage: u8,
|
||||||
max_value: usize,
|
max_value: usize,
|
||||||
checking_method: CheckingMethod,
|
checking_method: CheckingMethod,
|
||||||
) -> JoinHandle<()> {
|
) -> (JoinHandle<()>, Arc<AtomicBool>, Arc<AtomicUsize>) {
|
||||||
if let Some(progress_sender) = progress_sender {
|
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
|
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
||||||
|
let progress_thread_sender = if let Some(progress_sender) = progress_sender {
|
||||||
let progress_send = progress_sender.clone();
|
let progress_send = progress_sender.clone();
|
||||||
let progress_thread_run = progress_thread_run.clone();
|
let progress_thread_run = progress_thread_run.clone();
|
||||||
let atomic_counter = atomic_counter.clone();
|
let atomic_counter = atomic_counter.clone();
|
||||||
|
@ -415,7 +416,8 @@ pub fn prepare_thread_handler_common(
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
thread::spawn(|| {})
|
thread::spawn(|| {})
|
||||||
}
|
};
|
||||||
|
(progress_thread_sender, progress_thread_run, atomic_counter)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_info_and_wait_for_ending_all_threads(progress_thread_run: &Arc<AtomicBool>, progress_thread_handle: JoinHandle<()>) {
|
pub fn send_info_and_wait_for_ending_all_threads(progress_thread_run: &Arc<AtomicBool>, progress_thread_handle: JoinHandle<()>) {
|
||||||
|
|
|
@ -2,8 +2,8 @@ use std::collections::BTreeMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::fs::{DirEntry, Metadata, ReadDir};
|
use std::fs::{DirEntry, Metadata, ReadDir};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::Ordering;
|
||||||
use std::sync::Arc;
|
|
||||||
use std::time::UNIX_EPOCH;
|
use std::time::UNIX_EPOCH;
|
||||||
|
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
|
@ -338,9 +338,7 @@ where
|
||||||
// Add root folders for finding
|
// Add root folders for finding
|
||||||
folders_to_check.extend(self.root_dirs);
|
folders_to_check.extend(self.root_dirs);
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(self.progress_sender, 0, self.max_stage, 0, self.checking_method);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(self.progress_sender, &progress_thread_run, &atomic_counter, 0, self.max_stage, 0, self.checking_method);
|
|
||||||
|
|
||||||
let DirTraversal {
|
let DirTraversal {
|
||||||
collect,
|
collect,
|
||||||
|
|
|
@ -9,8 +9,7 @@ use std::io::{BufReader, BufWriter};
|
||||||
#[cfg(target_family = "unix")]
|
#[cfg(target_family = "unix")]
|
||||||
use std::os::unix::fs::MetadataExt;
|
use std::os::unix::fs::MetadataExt;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use std::{fs, mem};
|
use std::{fs, mem};
|
||||||
|
|
||||||
|
@ -678,17 +677,8 @@ impl DuplicateFinder {
|
||||||
let check_type = self.hash_type;
|
let check_type = self.hash_type;
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) =
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
prepare_thread_handler_common(progress_sender, 1, 2, self.files_with_identical_size.values().map(Vec::len).sum(), self.check_method);
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
self.files_with_identical_size.values().map(Vec::len).sum(),
|
|
||||||
self.check_method,
|
|
||||||
);
|
|
||||||
|
|
||||||
let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.prehash_load_cache_at_start();
|
let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.prehash_load_cache_at_start();
|
||||||
|
|
||||||
|
@ -844,18 +834,8 @@ impl DuplicateFinder {
|
||||||
|
|
||||||
let check_type = self.hash_type;
|
let check_type = self.hash_type;
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) =
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
prepare_thread_handler_common(progress_sender, 2, 2, pre_checked_map.values().map(Vec::len).sum(), self.check_method);
|
||||||
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
2,
|
|
||||||
2,
|
|
||||||
pre_checked_map.values().map(Vec::len).sum(),
|
|
||||||
self.check_method,
|
|
||||||
);
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////// HASHING START
|
///////////////////////////////////////////////////////////////////////////// HASHING START
|
||||||
{
|
{
|
||||||
|
|
|
@ -394,17 +394,7 @@ impl SameMusic {
|
||||||
|
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), self.check_type);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
non_cached_files_to_check.len(),
|
|
||||||
self.check_type,
|
|
||||||
);
|
|
||||||
let configuration = &self.hash_preset_config;
|
let configuration = &self.hash_preset_config;
|
||||||
|
|
||||||
// Clean for duplicate files
|
// Clean for duplicate files
|
||||||
|
@ -451,17 +441,7 @@ impl SameMusic {
|
||||||
|
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), self.check_type);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
non_cached_files_to_check.len(),
|
|
||||||
self.check_type,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Clean for duplicate files
|
// Clean for duplicate files
|
||||||
let mut vec_file_entry = non_cached_files_to_check
|
let mut vec_file_entry = non_cached_files_to_check
|
||||||
|
@ -591,9 +571,7 @@ impl SameMusic {
|
||||||
fn check_for_duplicate_tags(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
fn check_for_duplicate_tags(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
||||||
assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none");
|
assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none");
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 2, 2, self.music_to_check.len(), self.check_type);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 2, 2, self.music_to_check.len(), self.check_type);
|
|
||||||
|
|
||||||
let mut old_duplicates: Vec<Vec<MusicEntry>> = vec![self.music_entries.clone()];
|
let mut old_duplicates: Vec<Vec<MusicEntry>> = vec![self.music_entries.clone()];
|
||||||
let mut new_duplicates: Vec<Vec<MusicEntry>> = Vec::new();
|
let mut new_duplicates: Vec<Vec<MusicEntry>> = Vec::new();
|
||||||
|
@ -711,7 +689,7 @@ impl SameMusic {
|
||||||
stop_receiver: Option<&Receiver<()>>,
|
stop_receiver: Option<&Receiver<()>>,
|
||||||
atomic_counter: &Arc<AtomicUsize>,
|
atomic_counter: &Arc<AtomicUsize>,
|
||||||
base_files: Vec<MusicEntry>,
|
base_files: Vec<MusicEntry>,
|
||||||
files_to_compare: Vec<MusicEntry>,
|
files_to_compare: &[MusicEntry],
|
||||||
) -> Option<Vec<Vec<MusicEntry>>> {
|
) -> Option<Vec<Vec<MusicEntry>>> {
|
||||||
let mut used_paths: HashSet<String> = Default::default();
|
let mut used_paths: HashSet<String> = Default::default();
|
||||||
|
|
||||||
|
@ -767,13 +745,10 @@ impl SameMusic {
|
||||||
fn check_for_duplicate_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
fn check_for_duplicate_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
||||||
assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none");
|
assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none");
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
|
|
||||||
let (base_files, files_to_compare) = self.split_fingerprints_to_check();
|
let (base_files, files_to_compare) = self.split_fingerprints_to_check();
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 2, 2, base_files.len(), self.check_type);
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 2, 2, base_files.len(), self.check_type);
|
||||||
|
|
||||||
let Some(duplicated_music_entries) = self.compare_fingerprints(stop_receiver, &atomic_counter, base_files, files_to_compare) else {
|
let Some(duplicated_music_entries) = self.compare_fingerprints(stop_receiver, &atomic_counter, base_files, &files_to_compare) else {
|
||||||
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
|
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -300,9 +300,7 @@ impl SimilarImages {
|
||||||
folders_to_check.push(id.clone());
|
folders_to_check.push(id.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 2, 0, CheckingMethod::None);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 2, 0, CheckingMethod::None);
|
|
||||||
|
|
||||||
while !folders_to_check.is_empty() {
|
while !folders_to_check.is_empty() {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
|
@ -437,17 +435,8 @@ impl SimilarImages {
|
||||||
let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.hash_images_load_cache();
|
let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.hash_images_load_cache();
|
||||||
|
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) =
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), CheckingMethod::None);
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
|
||||||
progress_sender,
|
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
non_cached_files_to_check.len(),
|
|
||||||
CheckingMethod::None,
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut vec_file_entry: Vec<(FileEntry, ImHash)> = non_cached_files_to_check
|
let mut vec_file_entry: Vec<(FileEntry, ImHash)> = non_cached_files_to_check
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
|
@ -828,9 +817,9 @@ impl SimilarImages {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let _progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
let _atomic_counter = Arc::new(AtomicUsize::new(0));
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 2, 2, all_hashes.len(), CheckingMethod::None);
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 2, 2, all_hashes.len(), CheckingMethod::None);
|
||||||
|
|
||||||
// Don't use hashes with multiple images in bktree, because they will always be master of group and cannot be find by other hashes
|
// Don't use hashes with multiple images in bktree, because they will always be master of group and cannot be find by other hashes
|
||||||
|
|
||||||
|
|
|
@ -262,9 +262,7 @@ impl SimilarVideos {
|
||||||
folders_to_check.push(id.clone());
|
folders_to_check.push(id.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 1, 0, CheckingMethod::None);
|
|
||||||
|
|
||||||
while !folders_to_check.is_empty() {
|
while !folders_to_check.is_empty() {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
|
@ -393,18 +391,11 @@ impl SimilarVideos {
|
||||||
let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache_at_start();
|
let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache_at_start();
|
||||||
|
|
||||||
let check_was_stopped = 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 progress_thread_run = Arc::new(AtomicBool::new(true));
|
let _progress_thread_run = Arc::new(AtomicBool::new(true));
|
||||||
|
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
let _atomic_counter = Arc::new(AtomicUsize::new(0));
|
||||||
let progress_thread_handle = prepare_thread_handler_common(
|
let (progress_thread_handle, progress_thread_run, atomic_counter) =
|
||||||
progress_sender,
|
prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None);
|
||||||
&progress_thread_run,
|
|
||||||
&atomic_counter,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
non_cached_files_to_check.len(),
|
|
||||||
CheckingMethod::None,
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut vec_file_entry: Vec<FileEntry> = non_cached_files_to_check
|
let mut vec_file_entry: Vec<FileEntry> = non_cached_files_to_check
|
||||||
.par_iter()
|
.par_iter()
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::fs::{DirEntry, File, Metadata};
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::io::BufWriter;
|
use std::io::BufWriter;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
|
@ -149,9 +149,7 @@ impl Temporary {
|
||||||
folders_to_check.push(id.clone());
|
folders_to_check.push(id.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress_thread_run = Arc::new(AtomicBool::new(true));
|
let (progress_thread_handle, progress_thread_run, atomic_counter) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None);
|
||||||
let atomic_counter = Arc::new(AtomicUsize::new(0));
|
|
||||||
let progress_thread_handle = prepare_thread_handler_common(progress_sender, &progress_thread_run, &atomic_counter, 0, 0, 0, CheckingMethod::None);
|
|
||||||
|
|
||||||
while !folders_to_check.is_empty() {
|
while !folders_to_check.is_empty() {
|
||||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||||
|
|
Loading…
Reference in a new issue