如何将应用程序定义的消息发送到 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 中的事件循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义参数与保留事件一起发送到 Firebase 分析

如何在 PyQt 中向事件循环发出自定义事件

如何在Prism框架中的模块之间正确发送事件消息?

第38课 Qt中的事件处理(上)

如何将消息发送到 Android 中的其他应用程序?

如何将 Flutter 中的消息发送到通道 websocket?