跨线程窗口命令

cross-thread-window-commands feature 用来让非事件循环线程也能提交窗口控制命令,并唤醒 Flor 事件循环尽快处理。

[dependencies]
flor = { version = "0.1.0", features = ["direct2d", "cross-thread-window-commands"] }

这个 feature 会自动启用 event-loop-wakeup,让跨线程窗口命令请求入队后能够唤醒事件循环线程处理。

入口

启用后仍然使用同一套 WindowRequestApi

use flor::platform::WindowId;
use flor::windows::WindowRequestApi;

fn resize_from_worker(window_id: WindowId) {
    window_id.request_set_size((1024, 768));
    window_id.request_show().result(|result| {
        if let Err(err) = result {
            eprintln!("show failed: {err}");
        }
    });
}

这些方法不会直接调用平台窗口 API,而是把命令加入事件循环队列。事件循环会按 FIFO 顺序执行当前批次命令,并在执行后调用 result(...) 注册的回调。

可用命令

方法作用
request_update_window()请求同步窗口更新。
request_show() / request_hide()显示或隐藏窗口。
request_set_window_mode(mode)设置普通、最小化、最大化或全屏模式。
request_set_left(left) / request_set_top(top)单独设置窗口位置。
request_set_position((x, y))设置窗口位置。
request_set_width(width) / request_set_height(height)单独设置窗口尺寸。
request_set_size((width, height))设置窗口尺寸。
request_destroy()销毁窗口。
request_drag_window()触发系统窗口拖动。

什么时候启用

如果窗口控制只发生在事件循环线程内,可以直接调用 WindowApi 上的同步方法,也可以使用 request_* 方法但不启用该 feature。

如果业务线程、异步任务、后台回调或跨线程状态同步逻辑需要控制窗口,就应该启用 cross-thread-window-commands。它会使用 event-loop-wakeup 的唤醒能力,避免命令入队后长时间等待事件循环自然醒来。

request_* 方法本身始终可用;这个 feature 改变的是跨线程提交后的唤醒行为。