2016-04-05 16 views
0

Çoklu okuma hakkında bilgi edinmek için Rust'ta küçük bir oyun yazıyorum. İki döngüler, böyle bir mantıkla bir, render olanı, içerdiği kodu var:Veri bekletilmeden kilitlenmeden mpsc :: kanalından veri kapama

let (t1_entity_in, t1_entity_out) = mpsc::channel(); // ommited type definitions 

let (t1_event_in, t1_event_out) = mpsc::channel(); 

let entity = Entity::new(20,20); 

std::thread::spawn(move || { 
    let window = Window::new(1280,720); 
    loop { 
     // waits until parent send data 
     let entity = t1_entity_out.recv().unwrap(); 
     window.draw(entity); 
     window.flip(); 
     let events = window.get_events(); 
     // parent starts working 
    } 
}); 

'event_loop: loop { 
    // do stuff to the entity 
    t1_entity_in.send(entity.clone()); 
    // thread 1 starts workinng 

    // waits until thread 1 sends data 
    let events = t1_event_out.recv().unwrap(); // [1] 
    // thread 1 sent data, continues. 
    for event in events { 
     if event.type == event::QUIT { 
      break 'event_loop; 
     } 
    } 
} 

Bu kod çalışır, ancak hemen hemen olur tek iplik aynı şekilde davranıyor. Davranış istediğim [1] 'de işaretlenmiş, eğer bir olay iteratörünün beklemesi varsa, onu al, ama eğer sadece bir tane vermezsen ve devam et. Bunu nasıl yaparım?

cevap

2

Sana try_recv() gerektiğini düşünüyorum:

let events = match t1_event_out.try_recv() { 
    Ok(events) => events, 
    Err(TryRecvError::Empty) => continue, 
    Err(TryRecvError::Disconnected) => break, 
};