SDL & OpenGL & SDL_Timer_Callback_function: трабла

Модератор: Модераторы разделов

Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

SDL & OpenGL & SDL_Timer_Callback_function: трабла

Сообщение minoru-kun »

Имею следующую траблу с программкой под SDL:

Код:

#include <iostream> #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include <cmath> #define pi 3.141592653 using namespace std; class clock_arrow { float x,y; float length; float angle; public: void draw(); void tick(); clock_arrow(float len); }; clock_arrow::clock_arrow(float len = 1) { x = 0; y = 0; length = len; angle = 0; } void clock_arrow::draw() { glColor3f(1,1,1); glBegin(GL_LINE_STRIP); glVertex2f(x,y); glVertex2f(cos(angle), sin(angle)); glEnd(); } void clock_arrow::tick() { angle += 2*pi / 60; } Uint32 draw (Uint32 param, void* i) { static clock_arrow clock1; clock1.tick(); clock1.draw(); SDL_GL_SwapBuffers(); cout << "voom!" << endl; return(100); } int main () { SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); SDL_SetVideoMode(640,480,16,SDL_OPENGL); glLoadIdentity(); glColor3f(1,1,1); clock_arrow clock2; clock2.tick(); clock2.draw(); SDL_GL_SwapBuffers(); SDL_TimerID timer1 = SDL_AddTimer (100, draw, NULL); sleep(3); }

Стрелка, отрисовываемая clock2, выводится на ура, однако стрелка clock1 ни в какую не хочет отрисовываться. Хотя, сообщение voom наблюдаю. Читая доки по SDL наткнулся, что
The timer callback function may run in a different thread than your main program, and so shouldn't call any functions from within itself. You may always call SDL_PushEvent, however.

В какую сторону копать? :(
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: SDL & OpenGL & SDL_Timer_Callback_function: трабла

Сообщение minoru-kun »

Заметил так же, что в этом видоизмененном коде:

Код:

#include <iostream> #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include <cmath> #define pi 3.141592653 using namespace std; class clock_arrow { float x,y; float length; float angle; public: void draw(); void tick(); clock_arrow(float len); }; clock_arrow::clock_arrow(float len = 1) { x = 0; y = 0; length = len; angle = 0; } void clock_arrow::draw() { glColor3f(1,1,1); glBegin(GL_LINE_STRIP); glVertex2f(x,y); glVertex2f(cos(angle), sin(angle)); glEnd(); } void clock_arrow::tick() { angle += 2*pi / 60; } Uint32 draw (Uint32 param, void* i) { clock_arrow clock1; SDL_Event need_tick; need_tick.type = SDL_USEREVENT; need_tick.user.code = 5; SDL_PushEvent(&need_tick); return(1000); } int main () { SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); SDL_SetVideoMode(640,480,16,SDL_OPENGL); glLoadIdentity(); glClearColor (0,0,0,0); clock_arrow clock1; // SDL_TimerID timer1 = SDL_AddTimer (1000, draw, NULL); SDL_Event event; while (1) { while (SDL_PollEvent (&event)) { } if (event.type == SDL_KEYDOWN) { clock1.tick(); clock1.draw(); } } }

Стоит лишь послать одно событие, как оно не убирается из очереди вообще, и программа подвисает. Странно, вроде бы, SDL настолько проверенная библиотека... В чем может быть дело? Раньше такой проблемы не было...
Спасибо сказали: