我正在用 Rust 编写一个小游戏来学习多线程。我得到的代码包含两个循环,一个是逻辑循环,一个是渲染循环,如下所示:
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] 的行中,如果有事件迭代器在等待,请获取它,但如果没有,则只给我一个 None 并继续。我该怎么做?
最佳答案
我想你需要try_recv()
:
let events = match t1_event_out.try_recv() {
Ok(events) => events,
Err(TryRecvError::Empty) => continue,
Err(TryRecvError::Disconnected) => break,
};
关于multithreading - 如果没有数据等待,从 mpsc::channel 获取数据而不锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427347/