#winit #events #block #future #loops #async

winit-block-on

使用 winit 的事件循环阻塞 future

3 个不稳定版本

0.2.1 2023年11月12日
0.2.0 2023年2月7日
0.1.0 2023年2月7日

#61 in #winit

BSL-1.0 OR Apache-2.0

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 示例,以获取更复杂和深入的将 asyncwinit 结合的示例。

限制

在这两种情况下,用户事件 T 需要满足 Send'static。这是因为事件循环代理需要放入 Waker 中。另外,如果您不使用 run_return,future 需要满足 'static。如果将 block_on 直接集成到 winit 中,这两个限制都可以消除。

依赖

~2–16MB
~157K SLoC