【问题标题】:SDL2 resize event goes to wrong thread?SDL2 调整大小事件转到错误的线程?
【发布时间】:2016-12-06 08:32:36
【问题描述】:

我使用 Python 3.5 中的 SDL2,我有 2 个线程,每个线程都绘制到自己的 OpenGL 窗口。

绘图正常,所有鼠标和键盘事件都到达正确的线程。 只有当我调整其中一个窗口的大小时,resize 事件才会转到错误的窗口。

这是我的部分代码:

def pollEvent (self):
    event = s2.SDL_Event ()
    if s2.SDL_PollEvent (ct.byref (event)):
        if event.type == s2.SDL_QUIT:
            self.running = False
        elif event.type == s2.SDL_WINDOWEVENT:
            if event.window.event == s2.SDL_WINDOWEVENT_RESIZED:
                print (111, self.name, 222)
                self.event = resizeEvent
                self.width = event.window.data1
                self.height = event.window.data2
                self.reshape ()
            elif event.window.event == s2.SDL_WINDOWEVENT_CLOSE:
                self.running = False
            self.renderDisplayList ()
        elif event.type == s2.SDL_MOUSEBUTTONDOWN:
            print (222, self.name, 333)

SDL_MOUSEBUTTONDOWN 转到正确的窗口,打印正确的名称,但 SDL_WINDOWEVENT_RESIZED 转到错误的窗口,打印错误的名称。

有人知道是什么原因造成的吗? 每个 SDL 窗口只能从其自己的线程访问。

【问题讨论】:

  • 只有一个事件队列。窗口可以通过event.window.windowID确定。
  • 这很有帮助,谢谢!如果您将您的评论推广到一个答案,我可以归功于您。

标签: python sdl-2 pysdl2


【解决方案1】:

SDL 只制作一个事件队列。事件队列主要是线程安全的,但在逻辑上很难在多个线程中使用它。最好只在一个线程中读取事件并通过其他一些事情向其他线程发送通知。

对于窗口事件,它们包含windowID 字段。您可以通过SDL_GetWindowID 调用获取窗口的ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 2014-01-11
    • 2021-12-17
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2011-01-13
    相关资源
    最近更新 更多