如何在SDL中向事件循环发送应用自定义消息?
解决方案
SDL 提供了线程安全的SDL_PushEvent接口,可直接用于跨线程向主事件循环推送自定义事件,无需依赖定时器,修改方案如下:
- 先定义自定义事件类型标识,避免和其他用户事件冲突
// 自定义重绘事件ID,SDL_USEREVENT是所有用户事件的起始值 const uint SDL_REDRAW_EVENT = SDL_USEREVENT + 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();
- 主事件循环里的判断可以直接匹配你定义的事件类型即可,原有的逻辑基本不需要调整:
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
相关产品推荐
相关产品推荐

