@TicSo

Как правильно сложить дату-время в массив?

В приведенном ниже коде создаю три потока.
Не получилось сложить временные метки для каждого потока в свой массив: thd_1, thd_2, thd_3.

код

use std::sync::mpsc::{Sender, Receiver};
use std::sync::mpsc;
use std::{thread, time};
use chrono::prelude::*;

fn main() {
println!("- - - - -");
   let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel();
   let mut children = Vec::new(); 
   let mut ids = Vec::new();                          // собираем все сообщения сюда;
   let mut thd_1: Vec<DateTime<Local>> = vec![];      // собираем все временные_значения_t для конкретного потока; 
   let mut thd_2: Vec<DateTime<Local>> = vec![];
   let mut thd_3: Vec<DateTime<Local>> = vec![];

   for id in 1..4 {                                   // создаю три потока;
      let thread_tx = tx.clone();
      let child = thread::spawn(move || {
               
         for i in 1..6 {

            let t: DateTime<Local> = Local::now();
            if id == 1 {
               thd_1.push(t);
            }
            if id == 2 {
                thd_2.push(t);
             }
             if id == 3 {
                thd_3.push(t);
             }                         
            if i == 5 {
               thread_tx.send(id).unwrap();           // чтобы отправить сообщение только по окончании работы потока;
            }
            println!("{:?}_ поток, задача _{:?}, время: {:?}", id, i, t);
            thread::sleep(time::Duration::from_millis(3));
         }

      }); 
   
      children.push(child);
   }
   

   for _ in 1..4 {
      ids.push(rx.recv());
   }
       

   for child in children {
      child.join().expect("Дочерний поток паникует");
   }
   
   // порядок, с которым сообщения были отправлeны:
   println!("{:?}", ids);
   //
   println!("thd_1 = {:?}", thd_1);
   println!("thd_2 = {:?}", thd_2);
   println!("thd_3 = {:?}", thd_3);
//
println!("- - - - -");
}


В идеале в конце кода вывести из этих массивов 15 строк данных
(15 = 3 потока по 5 меток для каждого) в формате
`поток - время`
по возрастанию времени.
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
use chrono::prelude::*;
use std::sync::mpsc;
use std::sync::mpsc::{Receiver, Sender};
use std::{thread, time};

fn main() {
    println!("- - - - -");
    let mut children = Vec::with_capacity(3);

    for id in 0..children.capacity() {
        let child = thread::spawn(move || {
            let mut date_times = Vec::with_capacity(5);
            for i in 0..date_times.capacity() {
                let t: DateTime<Local> = Local::now();
                date_times.push(t);
                println!("{:?}_ поток, задача _{:?}, время: {:?}", id, i, t);
                thread::sleep(time::Duration::from_millis(3));
            }
            (id, date_times)
        });

        children.push(child);
    }

    for child in children {
        let (id, date_times) = child.join().expect("Дочерний поток паникует");
        println!("thd_{} = {:?}", id, date_times);
    }
    println!("- - - - -");
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы