我是相当新的C/C++编程,所以请原谅我,如果事情听起来很愚蠢,你...GTK +线程与OpenGL的GLUT/FreeGLUT
我目前的工作,涉及到一个Visual Studio C++ 2010项目opengl,glut/freeglut和gtk +。
OpenGL用于获取输入图像,在调用glDrawPixels()从缓冲区中绘制像素以在glut/freeglut窗口中显示之前,根据各种参数处理其像素。
现在我正在尝试制作一个UI,以便用户可以调整参数并在运行时查看生成的图像。
到目前为止,我所拥有的是一个GTK窗口,其中包含所有GTK小部件,以及包含OpenGL图像的glut/freeglut窗口。它的工作原理是当点击UI上的按钮时,会创建一个新的GTK线程来显示glut/freeglut窗口(其中包含OpenGL渲染图像)。
我的问题是,如何使glut/freeglut渲染更新的OpenGL图像并将其显示在相同的glut/freeglut窗口中?我不确定它是否与GTK线程或它只是glut/freeglut或两者兼而有之。剥离下来的代码,我有:
#include<freeglut.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <gtk/gtk.h>
GtkWidget *window;
GtkWidget *vbox, *hbox;
GtkWidget *button;
gint tmp_pos;
GThread *thread;
gint progress = 0;
G_LOCK_DEFINE_STATIC(progress);
GError *error = NULL;
void display()
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glRasterPos2i(x_offset,y_offset);
glDrawPixels(x2-x1+1,y2-y1+1,GL_LUMINANCE,GL_UNSIGNED_BYTE,tmp_buf);
glFlush();
}
static gpointer runGL(gpointer data)
{
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
if(Running_Mode==0)
glutInitWindowSize(3*Test_Size,Test_Size); /* 500 x 500 pixel window */
else
glutInitWindowSize(Test_Size,Test_Size); /* 500 x 500 pixel window */
glutInitWindowPosition(600,0); /* place window top left on display */
glutCreateWindow("Simulation"); /* window title */
glutDisplayFunc(display); /* display callback invoked when window opened */
myinit(); /* set attributes */
glutMainLoop(); /* enter event loop */
return (NULL);
}
/* create a g_thread for glut window */
void GLThread()
{
thread = g_thread_create(runGL, (gpointer)button, TRUE, &error);
g_print("Thread created");
if(!thread)
{
g_print("Error: %s\n", error->message);
return(-1);
}
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
if(! g_thread_supported())
g_thread_init(NULL);
gdk_threads_init();
/* Obtain gtk's global lock */
gdk_threads_enter();
gtk_init (&argc, &argv);
/* create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
gtk_window_set_title (GTK_WINDOW (window), "GTK Entry");
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect_swapped (window, "delete-event",
G_CALLBACK (gtk_widget_destroy),
window);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (vbox), hbox);
gtk_widget_show (hbox);
button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
/* call the GLThread function when the button is clicked */
g_signal_connect_swapped (button, "clicked", G_CALLBACK (GLThread), window);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
gtk_widget_set_can_default (button, TRUE);
gtk_widget_show (button);
gtk_widget_show(window);
gtk_main();
gdk_threads_leave();
}
重新检查你的问题逻辑。你非常需要上面粘贴的代码。与上面的代码相比,我没有看到任何问题/差异。 – drahnr
感谢您检查我的代码drahnr。我提供的代码实际上每次点击按钮时会打开一个新的过度窗口,这不是我想要的。我只需要两个窗口(和两个线程),一个是gtk UI本身,另一个是具有超显示窗口的线程。 – user3409114