7个版本 (4个破坏性更新)
0.5.0 | 2024年7月3日 |
---|---|
0.4.1 | 2024年5月6日 |
0.4.0 | 2024年4月2日 |
0.3.0 | 2024年2月7日 |
0.1.0 | 2023年8月20日 |
#579 in 异步
每月111次下载
在 5 crates 中使用
41KB
490 代码行
egui_inbox
用于从异步函数、回调等发送消息到egui视图的通道,无需使用内部可变性。当接收到消息时,将自动在request_repaint()
上调用Ui
。
此crate的目标 是使从异步代码与egui交互尽可能简单。目前它没有针对性能进行优化,所以如果您预计每帧发送数千个更新,您可能想使用e.g. std::sync::mpsc。性能可能在将来还会得到改进。
示例
use eframe::egui;
use egui::CentralPanel;
use egui_inbox::UiInbox;
pub fn main() -> eframe::Result<()> {
let inbox = UiInbox::new();
let mut state = None;
eframe::run_simple_native(
"DnD Simple Example",
Default::default(),
move |ctx, _frame| {
CentralPanel::default().show(ctx, |ui| {
// `read` will return an iterator over all pending messages
if let Some(last) = inbox.read(ui).last() {
state = last;
}
// There also is a `replace` method that you can use as a shorthand for the above:
// inbox.replace(ui, &mut state);
ui.label(format!("State: {:?}", state));
if ui.button("Async Task").clicked() {
state = Some("Waiting for async task to complete".to_string());
let tx = inbox.sender();
std::thread::spawn(move || {
std::thread::sleep(std::time::Duration::from_secs(1));
// Send will return an error if the receiver has been dropped
// but unless you have a long running task that will send multiple messages
// you can just ignore the error
tx.send(Some("Hello from another thread!".to_string())).ok();
});
}
});
},
)
}
依赖关系
~4–12MB
~127K SLoC