2013-02-09 5 views
0

У меня возникла странная проблема, когда glutTimerFunc, похоже, случайно перестает работать, когда я вызываю его с нулевой задержкой.Закрытие таймера таймера GLUT досрочно

Вот мой код:

#include <Windows.h> 
#include <GL/gl.h> 
#include <GL/glut.h> 

int x = 0; 

void init(void) 
{ 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 1.0, 0.125, 0.875, -1.0, 1.0); 
} 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glBegin(GL_POLYGON); 
    glColor3f(1.0, x ? 1.0 : 0.0, 0.0); 
    glVertex3f(0.25, 0.25, 0.0); 
    glVertex3f(0.75, 0.25, 0.0); 
    glVertex3f(0.75, 0.75, 0.0); 
    glVertex3f(0.25, 0.75, 0.0); 
    glEnd(); 
    glFlush(); 
    glutSwapBuffers(); 
} 

void timer(int value) 
{ 
    x = !x; 
    glutPostRedisplay(); 
    glutTimerFunc(0, timer, 0); // The line in question 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(800, 600); 
    glutInitWindowPosition(200, 200); 
    glutCreateWindow("hello"); 
    init(); 
    glutDisplayFunc(display); 
    glutTimerFunc(0, timer, 0); 
    glutMainLoop(); 
    return 0; 
} 

Я ожидал, чтобы показать мерцающий квадрат, который меняет цвет так быстро, как графический процессор может угнаться.

Это то, что на самом деле происходит на самом деле, но петля таймера кажется случайным образом остановлена, и квадрат перестает меняться. Иногда он не мерцает ощутимо вообще, и иногда он мерцает в течение нескольких секунд, прежде чем остановиться.

Это не останавливается, если я установил задержку на 1 мс (glutTimerFunc(1, timer, 0);).

Почему цепь таймера останавливается неожиданно?

Мне все равно, как это исправить, просто почему это происходит.

+1

Вставьте выходные операторы как в функции 'timer', так и' display'. Вы действительно наблюдаете, что звонки на одну остановку через несколько секунд? –

+0

@ н.м. Вставка 'printf' в функцию' timer', по-видимому, препятствует остановке таймера или, по крайней мере, замедляет его. Однако 'printf' в' display' останавливается, и наблюдение 'x' в отдельной функции показывает, что оно остановилось. Я уверен, что таймер останавливается. –

+0

Ну, это никогда не останавливается для меня. Интересно, что 'timer' вызывается гораздо чаще, чем' display' (для меня снова), нет никакой гарантии, что за каждым щелчком 'x' последует повторный просмотр. Если вы хотите это, заплатите повторный показ из 'display' (то есть' timer' вызывает 'glutPostRedisplay' и' display' вызывает 'glutTimerFunc'). –

ответ

0

Ваш графический процессор меняет значение быстрее, чем ваш монитор может его нарисовать.

Если у вас был монитор с очень высокой частотой обновления, возможно, вы его увидите, но, к сожалению, к настоящему времени мы ограничены частотой 60 Гц/120 Гц/240 Гц.

Когда вы удаляете вынужденную задержку 1 мс, вы вынуждаете систему стать недетерминированной системой (в зависимости от скорости других программ, а не только от ваших), и именно поэтому вы получаете случайное поведение.

+0

Смотрите мой комментарий к вопросу. Я довольно много решил, что таймер-цикл фактически останавливается. –

+0

Остановка таймера также не зависит от отображаемого кода. –

Смежные вопросы