Я работаю над проектом на языке C, где я собираюсь сделать несколько сложных физических расчетов, и мне нужна возможность увидеть результаты, когда я закончу. Сейчас это работает так: я запускаю GLUT в основном потоке и использую отдельный поток (pthread) для ввода (из терминала) и вычислений. В настоящее время я использую glutTimerFunc для анимации, но проблема в том, что эта функция будет срабатывать каждый заданный интервал времени, несмотря ни на что. Я могу остановить анимацию, используя оператор if в функции анимации, остановив обновление переменных, но это требует много ненужных ресурсов (я думаю).
Чтобы решить эту проблему, я подумал, что мог бы использовать дополнительный поток с пользовательской функцией таймера, которой я мог бы управлять сам (без того, чтобы GluMainLoop все испортил). В настоящее время это моя тестовая функция, чтобы проверить, будет ли она работать (это означает, что сама функция никоим образом не завершена). Он запускается в отдельном потоке, созданном непосредственно перед glutMainLoop:
void *threadAnimation() {
while (1) {
if (animationRun) {
rotate = rotate+0.00001;
if (rotate>360) {
rotate = rotate-360;
}
glutSetWindow(window);
glutPostRedisplay();
}
}
}
Конкретная проблема, с которой я сталкиваюсь, заключается в том, что анимация запускается всего на пару секунд, а затем останавливается. Кто-нибудь знает, как я могу это исправить? Я планирую использовать таймеры и т. д. позже, но я ищу способ гарантировать, что glutPostRedisplay будет отправлен в нужное место. Я думал, что glutSetWindow(window) – это решение, но, видимо, это не так. Если я удаляю glutSetWindow(window), анимация все еще работает, только не так долго, но работает намного быстрее (так что, возможно, glutSetWindow(window) требует много ресурсов?)
Кстати, переменная "window" создается так:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(854, 540);
glutInitWindowPosition(100, 100);
window = glutCreateWindow("Animation View");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
timerInt = pthread_create(&timerThread, NULL, &threadAnimation, NULL);
glutMainLoop();
Я не знаю, правильно ли это, но компилируется просто отлично. Любая помощь очень приветствуется!