如何将应用程序定义的消息发送到 SDL 中的事件循环?

How do I send an application-defined message to the event loop in SDL?

我刚刚开始使用 SDL2,因为真正希望在 C# 中实现可移植 UI。我有点喜欢一个 window、一个 canvas、一个事件循环的想法。使基本建模中的某些事情变得更简单。但这意味着现在我需要问一些非常基本的问题。

我有一个进入事件循环的前台线程。在某些时候,后台线程需要告诉前台线程应用程序状态已更改并且需要重绘某些内容(或根据情况重绘所有内容)。 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 计时器。那是样板。真正的代码是别的东西。

所以立即修复发送事件(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 对于该行来说更尴尬,但事实就是如此。