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

我刚刚开始使用 SDL2,因为在 C# 中具有可移植 UI 的真正前景。无论如何,我是一个窗口,一个画布,一个事件循环的想法的粉丝。使基本建模中的某些事情变得更简单。但这意味着现在我需要问一些非常基本的问题。

我有一个进入事件循环的前台线程。在某些时候,后台线程需要告诉前台线程应用程序状态已更改,并且需要重绘某些内容(或视情况而定的所有内容)。 SDL 有应用程序事件,但我不知道如何发送它们。

void redraw() {
    var surface = SDL_GetWindowSurface(window);
    SDL_FillRect(surface,IntPtr.Zero,SDL_MapRGB(surface.GetPixelFormat(),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 计时器。那是样板。真正的代码是别的东西。

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

所以立即修复发送事件(错误代码警报):

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 是否更尴尬,但就是这样。

本文链接:https://www.f2er.com/231.html

大家都在问