2012-10-08 42 views
0

我正在一个项目,我有一个opengl窗口和一个gtk窗口,现在我想能够从gtk控制opengl。Redraw从另一个线程的opengl

在Gtk窗口中我有一个调用图像生成器的按钮,之后我想重新绘制opengl窗口以便看到结果,但是如果从按钮单击回调调用显示函数,则不会发生任何反应。到目前为止,唯一的想法是当我将glutIdleFunc设置为我的显示功能时,这样opengl窗口不断重绘,但在我看来,必须有更好的方法。另外我尝试了glutTimerFunc来检查一个条件变量,但是还有更好的方法。

我的想法是能够告诉/信号/直接调用OpenGL的显示功能,或者强制glutMainLoop做一个迭代,每当我按一下按钮,但我真的不知道该怎么做。

任何想法?

回答

0

首先,我真的会推荐你停止使用普通GLUT。一旦您的应用程序发展成您所描述的那种需求(多窗口,GTK +,...),GLUT就不够灵活,无法成为可行的解决方案。

看看,例如GLFW作为一个合适的替代品,它是更加灵活的方式,实际上足以让真正的应用程序使用。

其次,你在标题中提到了线程,但没有在你的问题体中提到线程,所以如果你真的使用线程有点不清楚。如果你是,那么你需要看看线程安全的通信。 GTK +构建的glib库有几个API,请检查它们。如果不使用线程,你可能会离开几个直接的函数调用,并使OpenGL状态失效,重新绘制。

+0

我只是使用GTK GLArea小部件。 – datenwolf

1

任何想法?

请勿使用GLUT或GLFW或任何其他OpenGL框架。你正在使用GTK +,所以坚持。有一个GTK +的OpenGL部件。使用它。由于您的OpenGL代码与GTK +很好地集成在一起,您可以使用GLib的正常信号事件机制(由GTK +使用),而不需要再花时间。