Я пытался избавиться от вещи glutMainLoop();
, и просто использовал цикл ручной работы
... после этого программа просто зависает ...
Это плохая идея, потому что в общем случае единственный способ получить обработку события при использовании GLUT - это glutMainLoop()
.
См. glutMainLoop
:
glutMainLoop
входит в цикл обработки событий GLUT.Эта процедура должна вызываться не более одного раза в программе GLUT.После вызова эта процедура никогда не вернется.При необходимости он будет вызывать любые обратные вызовы, которые были зарегистрированы.
Обратите внимание, glutMainLoop()
не только вызывает функцию обратного вызова, которую вы установили с помощью glutDisplayFunc
, но также принимает и обрабатываетСобытия ввода-вывода, такие как события мыши и клавиатуры.Если вы не используете glutMainLoop()
, то у вас нет обработки событий и, конечно, нет обработки событий ввода-вывода.Это приводит к тому, что программа, кажется, зависает и не реагирует ни на какой ввод.
Либо вы должны использовать glutMainLoop()
, либо вам нужно переключить другой оконный API, например GLFW , где вы можете явно указатьактивируйте обработку событий с помощью glfwPollEvents()
Более новые реализации GLUT, такие как freeglut , предоставляют некоторые дополнительные функции.glutMainLoopEvent()
делает то же самое, что и glutMainLoop()
, но делает это только один раз.Он выполняет одну итерацию цикла событий и немедленно возвращает управление.Таким образом, вы можете реализовать свой собственный цикл, который обрабатывает ваше приложение.
например
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
Можно даже установить функцию отображения dummy , которая ничего не делает, и делатьчертеж в цикле:
например
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}