我如何一起使用GTK和过剩?

时间:2012-05-02 19:43:14

标签: c++ c gtk glut

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

gtk_main();

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

现在让我们假设我喜欢我的GTK应用程序来显示我用glut编写的内容,它本身包含一堆关于需要设置图形的语句等等,然后以语句结束:

glutMainLoop();

此后不执行任何操作。

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

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

2 个答案:

答案 0 :(得分:4)

你不是。通常没有任何意义。

GLUT是一个用于创建和管理OpenGL窗口的库。 GTK已经拥有一个OpenGL窗口。如果你正在使用GTK,那么使用GLUT是没有意义的。它就像有两个矢量数学库或其他东西。

答案 1 :(得分:3)

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

<强> gtk_main() at GTK.org

  

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

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

<强> glutMainLoop() at OpenGL.org

  

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

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

<强> gtk_main_iteration() at GTK.org

  

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

现在...... GLUT没有等效于gtk_main_iteration()所以你需要注册GLUT回调。

您可以使用gtk_main_iteration()使用glutIdleFunc(void (*func)(void))注册回调,该回调会针对每一帧运行回调 - glutIdleFunc() ..

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

我可能会尝试两者,glutIdleFunc()可能并不总是被定期调用以获得良好的响应能力。

尽管如此,值得关注驾驶GTK's GL support