You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SDL中向事件循环发送应用自定义消息?

解决方案

SDL 提供了线程安全的SDL_PushEvent接口,可直接用于跨线程向主事件循环推送自定义事件,无需依赖定时器,修改方案如下:

  1. 先定义自定义事件类型标识,避免和其他用户事件冲突
// 自定义重绘事件ID,SDL_USEREVENT是所有用户事件的起始值
const uint SDL_REDRAW_EVENT = SDL_USEREVENT + 1;
  1. 替换后台线程中/* SEND EVENT HERE */部分的代码,构造事件并推送
new Thread(() => {
    Thread.Sleep(30000);
    // 构造用户事件
    SDL_Event ev = new SDL_Event();
    ev.type = SDL_REDRAW_EVENT;
    // 推送到事件队列,该方法是SDL官方明确支持跨线程调用的线程安全接口
    SDL_PushEvent(ref ev);
}).Start();
  1. 主事件循环里的判断可以直接匹配你定义的事件类型即可,原有的逻辑基本不需要调整:
while (!done && SDL_WaitEvent(out var ev) != 0) {
    switch (ev.type) {
        case SDL_REDRAW_EVENT:
            redraw();
            break;
        case SDL_WINDOWEVENT:
            switch (ev.window.windowEvent) {
                case SDL_WINDOWEVENT_CLOSE:
                    SDL_DestroyWindow(window);
                    done = true;
                    break;
            }
            break;
    }
}

如果后续需要随事件传递自定义状态数据,可以使用SDL_UserEvent结构体的data1、data2字段传递指针,注意保证数据在主事件消费完成前不被释放即可。


内容的提问来源于stack exchange,提问作者Joshua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 07:27:04