Задать вопрос
@TicSo

Как поправить код для отдельного потока, чтобы обрабатывать данные по заданному времени?

Приведенный ниже код позволяет вводить в консоли текст для его хранения
или удаления в/из вектора 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());
   }     
}

  • Вопрос задан
  • 46 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы