3 个不稳定版本
0.2.1 | 2023年11月12日 |
---|---|
0.2.0 | 2023年2月7日 |
0.1.0 | 2023年2月7日 |
#61 in #winit
320KB
174 行
winit-block-on
使用 winit
在 futures 上进行阻塞。这使 winit
能够无缝集成到 async
生态系统。
许可证
此软件包由 Boost 软件许可证版本 1.0 或 Apache 许可证版本 2.0 双重授权。
Roboto Regular 许可证受 Open Font 许可证约束。
lib.rs
:
一个简单的包装器,允许用户使用 winit
事件循环阻塞 future。
winit
默认不支持 async
编程。此包提供了一种小型的解决方案,允许用户使用 winit
事件循环阻塞 future。
示例
use winit::event::{Event, WindowEvent};
use winit::event_loop::{ControlFlow, EventLoopBuilder};
use winit::window::WindowBuilder;
use winit_block_on::prelude::*;
use std::future::pending;
use std::time::Duration;
// Create an event loop.
let event_loop = EventLoopBuilder::new_block_on().build();
// Create a window inside the event loop.
let window = WindowBuilder::new().build(&event_loop).unwrap();
// Create a proxy that can be used to send events to the event loop.
let proxy = event_loop.create_proxy();
// Block on the future indefinitely.
event_loop.block_on(
move |event, _, control_flow| {
match event {
Event::UserEvent(()) => control_flow.set_exit(),
Event::WindowEvent {
event: WindowEvent::CloseRequested,
window_id
} if window_id == window.id() => control_flow.set_exit(),
_ => {}
}
},
async move {
// Wait for one second.
async_io::Timer::after(Duration::from_secs(1)).await;
// Tell the event loop to close.
proxy.send_event(()).unwrap();
}
)
这是一个假设的例子,因为 control_flow.set_wait_deadline()
可以完成相同的事情。请参阅 networking
示例,以获取更复杂和深入的将 async
与 winit
结合的示例。
限制
在这两种情况下,用户事件 T
需要满足 Send
和 'static
。这是因为事件循环代理需要放入 Waker
中。另外,如果您不使用 run_return
,future 需要满足 'static
。如果将 block_on
直接集成到 winit
中,这两个限制都可以消除。
依赖
~2–16MB
~157K SLoC