gpt4 book ai didi

multithreading - 多线程 X11 应用程序和 OpenGL

转载 作者:行者123 更新时间:2023-12-04 06:47:51 27 4
gpt4 key购买 nike

我正在尝试使用 libx11 创建一个多线程 opengl 应用程序 - 每个窗口有一个单独的线程和一个管理器线程。

我在管理器线程中有一个事件循环:

while(true)
while(XQLength(mPlatformData->display)){
XNextEvent(mPlatformData->display, &event);
std::cout << "event" << std::endl;
}
}

对于单线程应用程序来说,这是一个很棒的事件循环,但是在这种多线程设置中会发生奇怪的事情。

当我创建一个窗口时,我需要禁用事件队列,否则 GLXMakeCurrent 将挂起 - 我的整个线程停止,并且什么都不做。

我在网上找不到很多关于多线程 X11 应用程序的信息,我应该以不同的方式处理我的事件吗?

最佳答案

众所周知,Xlib 有几个无法修复的运行时问题,这些问题在并发访问情况下会表现出来。我猜你正遇到其中之一。

这是最初创建 Xcb 的原因之一:修复 Xlib 的问题。 GLX 是针对 Xlib 指定的,因此当涉及到 OpenGL 时,这可能看起来像是一个阻碍。然而,Xcb 周围有一个 Xlib,可以安全地使用它与 GLX 接口(interface),并且仍然在程序的其余部分使用 Xcb:http://xcb.freedesktop.org/opengl/

我看到两种可能的解决方案:

  • 放一个XLockDisplay/互斥体XNextEvent GLX 调用每个;您不必锁定普通的 OpenGL,只需使用前缀为 glX... 的函数即可.
  • 使用 Xcb 获得运行时正确的行为,并按照我上面链接的指南使其与 OpenGL/GLX 一起使用。
  • 关于multithreading - 多线程 X11 应用程序和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6402476/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com