如何将应用程序定义的消息发送到 SDL 中的事件循环?
Posted
技术标签:
【中文标题】如何将应用程序定义的消息发送到 SDL 中的事件循环?【英文标题】:How do I send an application-defined message to the event loop in SDL? 【发布时间】:2021-10-07 10:04:21 【问题描述】:我刚刚开始使用 SDL2,因为真正承诺在 C# 中拥有可移植 UI。无论如何,我有点喜欢一个窗口、一个画布、一个事件循环的想法。使基本建模中的某些事情变得更简单。但这意味着我现在需要问一些非常基本的问题。
我有一个进入事件循环的前台线程。在某些时候,后台线程需要告诉前台线程应用程序状态发生了变化,并且它需要重绘某些东西(或视情况而定)。 SDL 有应用程序事件,但我不知道如何发送它们。
void redraw()
var surface = SDL_GetWindowSurface(window);
SDL_FillRect(surface, IntPtr.Zero, SDL_MapRGB(surface.GetPixelFormat(), 0x9F, 0x9F, 0xFF));
SDL_UpdateWindowSurface(window);
new Thread(() =>
Thread.Sleep(30000);
/* SEND EVENT HERE */
).Start();
bool done = false;
while (!done && SDL_WaitEvent(out var ev) != 0)
switch (ev.type)
case SDL_USEREVENT:
redraw();
break;
case SDL_WINDOWEVENT:
switch (ev.window.windowEvent)
case SDL_WINDOWEVENT_CLOSE:
SDL_DestroyWindow(window);
done = true;
break;
break;
但我找不到如何从其他线程发送用户事件。
不要告诉我使用 SDL 计时器。那是样板。真正的代码是另外一回事。
【问题讨论】:
您首先需要注册一个自定义事件,然后您需要轮询 SDL(就像您已经在做的那样)。查看SDL_UserEvent @MindSwipe:在点击该链接时,SDL_PushEvent 是我未能通过 Google 找到的函数。要写答案还是我要写? 老实说,我从来没有用 SDL 做过任何事情,我什至用 C 做的事情也不多,而且我无法在本地轻松测试任何解决方案,所以继续吧 【参考方案1】:所以立即修复发送事件(BAD CODE ALERT):
new Thread(() =>
Thread.Sleep(30000);
SDL_Event sdlevent = new SDL_Event();
sdlevent.type = SDL_USEREVENT;
SDL_PushEvent(ref sdlevent);
).Start();
但如果其他人注册事件,则此代码是错误的。我们需要注册一个事件,获取 ID,然后使用它。
var myevent = (SDL_EventType)SDL_RegisterEvents(1);
new Thread(() =>
Thread.Sleep(30000);
SDL_Event sdlevent = new SDL_Event();
sdlevent.type = myevent;
SDL_PushEvent(ref sdlevent);
).Start();
case
行现在改为
case var typemyevent when typemyevent == myevent:
我不确定对于 C# 或 SDL 是否更尴尬,但事实就是这样。
【讨论】:
以上是关于如何将应用程序定义的消息发送到 SDL 中的事件循环?的主要内容,如果未能解决你的问题,请参考以下文章