4

我知道为了编写 GTK 应用程序,我编写了一堆代码来描述放在主窗口中的内容,然后我调用:

gtk_main();

在此之后的任何代码语句都不会被执行。

现在让我们假设我希望我的 GTK 应用程序显示我用 glut 编写的东西,它本身包含一堆关于需要设置哪些图形等的语句,然后以语句结束:

glutMainLoop();

在此之后的任何内容都不会执行。

所以我的问题是这两个语句中的任何一个都阻止我调用另一个。

  1. 有没有办法在 GTK 小部件中执行 glut 主循环?
  2. 有没有办法编写可以同时调用 GTK 主循环和 glut 主循环的代码(但从主程序调用并在单独的 X 窗口中呈现,而不是在小部件内)?我有一种感觉,这可以用“线程”来完成......
4

2 回答 2

4

你没有。一般没有什么意义。

GLUT 是一个用于创建和管理 OpenGL 窗口的库。GTK 中已经一个 OpenGL 窗口。如果您使用的是 GTK,那么使用 GLUT 毫无意义。这就像拥有两个向量数学库或其他东西。

于 2012-05-02T19:45:16.560 回答
3

您正在运行主循环。gtk_main()运行直到gtk_quit()被调用。

GTK.org 上的 gtk_main()

运行主循环,直到gtk_main_quit()被调用。您可以嵌套调用 gtk_main()。在这种情况下, gtk_main_quit() 将使主循环的最内层调用返回。

此外,glutMainLoop()工作方式相同,它永远处理 GL 事件。

OpenGL.org 上的 glutMainLoop()

glutMainLoop()进入 GLUT 事件处理循环。该例程在 GLUT 程序中最多应调用一次。一旦被调用,这个例程将永远不会返回。它将根据需要调用已注册的任何回调。

所以,你不想同时执行这两件事(我认为它们可能会相互干扰,所以你可能会得到意想不到的结果)然后你需要gtk_main_iteration()从内部过剩调用。

GTK.org 上的 gtk_main_iteration()

运行主循环的单次迭代。如果没有事件等待处理,GTK+ 将阻塞直到注意到下一个事件。如果您不想阻止查看 gtk_main_iteration_do() 或首先使用 gtk_events_pending() 检查是否有任何事件未决。

现在.. GLUT 没有等效项,gtk_main_iteration()因此您将需要注册 GLUT 回调。

您可以使用 GLUT 注册一个回调,该回调gtk_main_iteration()使用 glutIdleFunc(void (*func)(void))它将为每一帧运行一个回调 - glutIdleFunc() ..

或者你可以给一个回调来调用并检查每 200 毫秒左右glutTimerFunc(unsigned int msecs, void (*func)(int value), value)的返回值。gtk_main_iteration()

我可能会同时尝试这两种方法,glutIdleFunc()可能并不总是经常被调用以获得良好的响应能力。

不过,推动GTK 的 GL 支持确实值得一看。

于 2012-05-03T07:34:23.720 回答