【发布时间】:2020-06-15 23:02:43
【问题描述】:
我是 Rust 的新手,我很难理解如何在无限循环中使用 tokio 和阻塞代码。我有两个按钮连接到我的 Raspberry Pi 3,我想听 either 按钮被按下。我正在为此使用rust_gpiozero crate。
这里是按钮代码:
use rust_gpiozero::*;
let mut button = Button::new(19);
button.wait_for_press(None); // blocking here
我不知道如何持续监听主代码中的任一按钮。我想我应该使用tokio::task::spawn_blocking,但我不确定如何使用。像这样的:
#[tokio::main]
async fn main() {
let b1_blocking_task = tokio::task::spawn_blocking(|| {
let mut button = Button::new(19);
button.wait_for_press(None); // blocks here
});
let b2_blocking_task = tokio::task::spawn_blocking(|| {
let mut button = Button::new(26);
button.wait_for_press(None); // blocks here
});
loop { // forever listen for button presses
tokio::select! {
_ = b1_blocking_task => {
println!("Button 1 pressed")
}
_ = b2_blocking_task => {
println!("Button 2 pressed")
}
};
}
}
上面的代码不起作用,但是如何正确执行此操作的最佳策略是什么?
【问题讨论】:
-
在生成的任务中使用通道和循环。
-
嗨 Stargateur,感谢您的回复。我不确定我是否遵循,你的意思是把每个
wait_for_press函数放在自己的循环中{},然后再进行频道发送调用?
标签: rust rust-tokio