LINUX.ORG.RU

SDL_CreateThread() Помогите:((


0

0

Всем привет!! Пробл вот в чем. Решил пустить поток с помошью SDL_CreateThread и непосредственно из него выресовывать объект. Раньше я это делал непосредственно в самом цикле программы и всё замечательно работало. Но после того как я поместил функцию render в поток программа стала вылетать с ошибкой Fatal signal: Segmentation Fault (SDL parachute Deployed). В чем может быть ошибка раскрытия этого греба...ого парашута SDL. Помогите пожалуйста кому не лень. Заранее огромное спасибо!

void render() {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0, -1.7); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // ñì. glLineWidth(6.0); glBegin(GL_LINES); glVertex2f(-0.565,0.121); glVertex2f(-0.565,0.352); glEnd(); glFlush(); SDL_GL_SwapBuffers(); }

int threadFunc(void *read) { while(!done) { SDL_Delay(100); render(); } return (0); }

int main(int argc, char **argv) {

SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO); SDL_SetVideoMode(WIDTH,HEIGHT,32,SDL_OPENGL | SDL_FULLSCREEN); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1f,50.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); SDL_ShowCursor(SDL_DISABLE); glClearDepth(1); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glEnable(GL_MAP2_VERTEX_3); glEnable(GL_AUTO_NORMAL);

glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_POSITION, lightpos); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glClearColor(1,1,1,1);

SDL_Thread *thread;

thread = SDL_CreateThread(threadFunc, NULL); if (thread == NULL) { cout<<"Thread error"<<endl; return; }

while(!done) { SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: done = 1; break; } } SDL_Delay(20); // render(); } SDL_Quit(); return 0; }


ХМ....
Очень трудно читать твой неформатированый код.

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

Вот выдержка из документации:


Don't call SDL video/event functions from separate threads
Don't use any library functions in separate threads
Don't perform any memory management in separate threads
Lock global variables which may be accessed by multiple threads
Never terminate threads, always set a flag and wait for them to quit
Think very carefully about all possible ways your code may interact

Dead ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.