2016-04-05 1 views
0

私はマルチスレッドについて学ぶためにRustの小さなゲームを書いています。う待機中のデータがない場合、ロックせずにmpsc :: channelからデータを取得

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; 
     } 
    } 
} 

このコードは動作しますが、それはかなりのシングルスレッドと同じように動作している:私はこのような二つのループ、ロジックを持つ1、レンダリングを持つものを、含まれているコードを得ました。私が望む振る舞いは、イベントイテレータが待っているならば[1]と書かれた行にあります。それ、どうやったら出来るの?

答えて

2

私はあなたがtry_recv()が必要だと思う:

let events = match t1_event_out.try_recv() { 
    Ok(events) => events, 
    Err(TryRecvError::Empty) => continue, 
    Err(TryRecvError::Disconnected) => break, 
}; 
関連する問題