【问题标题】:2 threads - one with opengl window and the second with wxwidgets one2 个线程 - 一个带有 opengl 窗口,第二个带有 wxwidgets 一个
【发布时间】:2012-12-08 07:24:28
【问题描述】:

我正在编写一个编辑器,但我遇到了一个问题,这意味着从我的 opengl 应用程序调用本机文件保存/打开对话框。编辑器是用我在游戏中的 opengl gui 编写的。所以我想出了一个想法,当用户按下“加载”或“保存”时,我将创建一个线程,该线程将创建所需的(不可见的)wx 窗口,它将调用 wxFileDialog 并在工作完成后删除该线程.是否有可能或者有更好的方法从 opengl 应用程序以跨平台方式访问文件打开/保存对话框?

【问题讨论】:

  • 我不知道您所说的“我的 opengl 应用程序”是什么意思。 OpenGL 是一个库,可以从使用各种不同框架编写的应用程序中调用,其中包括 wxWidgets。您应该使用应用程序框架提供的任何文件保存对话框。
  • 呃我忘记写了。 SFML 管理窗口,它使用 opengl 进行渲染。 SFML 当然没有任何 gui 功能。另外,“opengl 应用程序”是指“没有 gui 应用程序”(你知道,类似于游戏)。
  • 只使用一个框架。 wxWidget 有一个 OpenGL 小部件,使用它来代替 SFML。
  • 抱歉,有点误会了。 SFML 在内部使用 OpenGL 进行渲染,我通过 OpenGL 渲染但使用 SFML 函数。所以创建 opengl 小部件对我没有帮助,因为我的引擎在 sfml 中。
  • 我不知道什么是 SFML。也许您应该用 SFML 标记您的问题,并可能吸引知道的人。

标签: c++ multithreading user-interface opengl wxwidgets


【解决方案1】:

wxWidget 有一个 OpenGL 小部件。把你的 OpenGL 东西放到这个里面,把小部件收到的事件转发到你的 GUI 系统,然后你就不必为事件循环而战了。

【讨论】:

    【解决方案2】:

    正如其他人已经说过的,最简单的解决方案是将 wxWidgets 用于主循环,将wxGLCanvas 用于 OpenGL 的东西。

    但如果这是不可能的,出于某种原因,您确实应该能够从另一个线程使用 wxWidgets。请记住,wxWidgets GUI 功能只能在单个线程中使用,因此您也需要从该线程初始化它。当然,您需要自己处理线程同步,因为 wxWidgets 不会知道您程序的其余部分。

    【讨论】:

      【解决方案3】:

      如果您使用的是 GLUT 或等效的,那么您没有跨平台框架。如果你想要一个跨平台的应用程序,那么你将不得不选择一个框架(例如 wxWidgets 或 Qt 或其他)并从那里开始。否则,如果您在 windows 上,则可以使用对 windows API 的本机调用,在其他平台上也可以使用等价物。

      GLUT 只为您提供控制台风格的应用程序。如果你想要一个 GUI,那么你必须选择一个 GUI 框架,即使你不想要跨平台。有很多选择,选择主要取决于你最熟悉的。然后,您从您的 GUI 应用程序中添加对 OpenGL 库的调用,无论是如何构建的。这样,您就不必处理多个线程。

      您可能对 GLUT 应用程序进行了大量投资,并且不想仅仅为了获得一些 GUI 功能而放弃它。在这种情况下,我建议构建一个新的 GUI 应用程序,与您的 GLUT 应用程序分开,它使用套接字(或其他进程间通信系统)与您现有的应用程序通信,但在单独的进程中运行。这样您就不会遇到由多线程应用程序创建的所有可怕且难以修复的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 2015-07-28
        • 1970-01-01
        • 2018-07-24
        • 1970-01-01
        相关资源
        最近更新 更多