Приведенный ниже код позволяет вводить в консоли текст для его хранения
или удаления в/из вектора
v_txt_main
Его данные передаются в отдельный поток и также выводятся в консоли.
Не получается сделать следующее:
Нужно выводить эти данные (в отдельном потоке в консоли) раз в 10 секунд,
но предварительно получать их сюда `
let job = rx.recv();` только на девятой секунде,
т.е. за секунду до вывода данных в отдельном потоке в консоли.
Таким образом буду выводить актуальные данные вектора, давая ~ 9 сек. на его изменение.
Заданные интервалы (10 и 1 секунды), - тестовые и будут уменьшены, поэтому скорость кода важна. Как делал:
Оборачивал код отдельного потока в циклы (loop) и по делению времени без остатка
пытался решить вопрос ... , - не получилось.
код
// [dependencies]
// chrono = "0.4.41"
use std::io;
use std::collections::HashMap;
//
use std::thread;
use std::thread::sleep;
use std::time::Duration;
use std::sync::mpsc;
//
use std::sync::mpsc::Sender;
use std::sync::mpsc::Receiver;
//
use chrono::prelude::*;
fn main() {
let mut v_txt_main: Vec<String> = Vec::new();
let (tx, rx):(Sender<Vec<String>>, Receiver<_>) = mpsc::channel();
thread::spawn(move || {
loop {
let job = rx.recv();
for v in job.unwrap().iter() {
println!("from thread: {:?} -> {:?} -> {:?}", &v, Utc::now(), Utc::now().timestamp_subsec_millis());
}
sleep(Duration::from_millis(10));
}
});
loop {
let mut h_add_del_txt: HashMap<u8, String> = HashMap::new();
let console: (u8, String) = f01();
// println!("Принято с консоли: {:?}", &console);
if console.0 == 1 {
h_add_del_txt.insert(1, console.1);
} else if console.0 == 2 {
h_add_del_txt.insert(2, console.1);
} else {
// ...
}
for (k, v) in &h_add_del_txt {
if v_txt_main.iter().any(|n| *n == *v) {
if *k == 1 {
//
} else if *k == 2 {
//
v_txt_main.retain(|a| *a != *v);
} else {
// ...
}
} else {
if *k == 1 {
//
v_txt_main.push(v.clone());
} else if *k == 2 {
//
} else {
// ...
}
}
}
let _ = tx.send(v_txt_main.clone());
sleep(Duration::from_millis(20));
}
}
fn f01() -> (u8, String) {
println!("\nВведите вариант (1 или 2): \n 1 - для добавления `ТЕКСТА`\n или \n 2 - для удаления `ТЕКСТА`\n");
let mut flag = String::new();
io::stdin().read_line(&mut flag).expect("Failed to read line");
let flag: u8 = flag.trim().parse().expect("Please type a number!");
if flag == 1 {
println!("Внесите ТЕКСТ на добавление:");
let mut g = String::new();
io::stdin().read_line(&mut g).expect("Failed to read line");
let g: String = g.trim().parse().expect("Please type ...");
return (flag, g);
} else if flag == 2 {
println!("Внесите ТЕКСТ на удаление:");
let mut g = String::new();
io::stdin().read_line(&mut g).expect("Failed to read line");
let g: String = g.trim().parse().expect("Please type a ...");
return (flag, g);
} else {
return (0, "Error_...".to_string());
}
}