2010-12-18 4 views
-1

OpenGL 프로그램에서 스레드를 실행하려고합니다. 지금 당장 나는 내 그룹에 선물하기위한 프로토 타입 작업을하고있다. 본질적으로 Win32 API의 :: PeekMessage() 함수를 사용하여 많은 지형을 렌더링해야 할 때 고르지 못한 결과가 발생합니다. 따라서 주 스레드가 모든 입력을 처리하는 동안 렌더링 스레드가 계속 실행되도록 렌더링을 시도하고 있습니다. 스레드가 올바르게 시작되었지만 어떻게 든 조기에 중단됩니다. 내 코드에서 무엇이 원인인지 파악할 수 없습니다. 코드베이스가 작기 때문에이 작업에 많은 경험을 가진 사람이라면 진단하기가 어려울 것이라고 생각하지 않습니다. 전체 코드는 3 개의 소스 파일로 이루어져 있으며 길이가 100 줄을 넘지 않으며에서 찾을 수 있습니다. 내 루프 플래그가 true 함수의 상단에 어떻게 든Win32 API 렌더러 스레드 및 OpenGL

void ControllerGL::runThread(){ 



/* 
    * BEFORE RESIZE EVEN MAKE SURE TO GET DEMINSIONS OF WINDOW 
    */ 

RECT clientArea; 
::GetClientRect(this->hwnd, &clientArea); 
this->wndWidth = clientArea.right - clientArea.left; 
this->wndHeight = clientArea.bottom - clientArea.top; 
char out[256]; 
sprintf(out, "1) %d X %d --> %d", this->wndWidth, this->wndHeight, this->loopFlag); 
MessageBox (NULL, TEXT(out), TEXT("Message Box"), 0); 



/* 
    * BEFORE WE ENTER MAIN RENDERING LOOP SET OPENGL 
    * FLAGS AND CLEAR ALL BUFFERS 
    */ 
glEnable(GL_DEPTH_TEST); 
glClearDepth(1.0); 
glClearColor(0.0, 0.0, 0.0, 1.0);      
/* 
    * END OF SET OPENGL FLAGS AND CLEAR ALL BUFFERS 
    */ 

/* 
    * Main Rendering Loop 
    */ 

//*/ 
while(this->loopFlag){ 
    //*/ 
    ::Sleep(50); 
    if(this->resizeFlag > 0){ 
    this->resizeFlag = 0; 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    float aspectRatio = (float)((this->wndWidth)/(this->wndHeight)); 
    gluPerspective(45.0f, aspectRatio, 1.0f, 100000.0); 
    glViewport(0, 0, this->wndWidth, this->wndHeight); 
    } 
    char out[256]; 
    sprintf(out, "2) %d X %d --> %d", this->wndWidth, this->wndHeight, this->loopFlag); 
    MessageBox (NULL, TEXT(out), TEXT("Message Box"), 0); 
    glEnable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0.0f, 0.0f, 10.0f, 0.0f, 0.0f, -10.0f, 0.0f, 1.0f, 0.0f);   
    glBegin(GL_TRIANGLES);  
    glColor3f(1.0, 0.0, 0.0); 
    glVertex3f(0.0f, 5.0f, 0.0f); 
    glColor3f(0.0, 1.0, 0.0);  
    glVertex3f(-5.0f,-5.0f, 0.0f); 
    glColor3f(0.0, 0.0, 1.0);  
    glVertex3f(5.0f,-5.0f, 0.0f);  
    glEnd(); 
    ::SwapBuffers(this->hdc);      
    //*/ 
} 
//*/ 
/* 
    * END OF MAIN RENDERING LOOP 
    */ 
::wglMakeCurrent(NULL, NULL); 
::CloseHandle(this->threadHandle); 
} 

: 그 코드는 다음과 같다 (76) -

http://99.116.251.16/code/WIN32/Vers2/

는 특히, 내 문제는 21 ContrllerGL.cpp 행 번호에서 발생 그러나 어떻게 든 그것이 루프에 도착할 때까지는 false로 평가됩니다. 왜 깨뜨려야만하는 유일한 이유는 그것이 생성 된 주 스레드가 종료 되었기 때문입니다. 그러나 프로그램을 컴파일하면 주 창이 아직 살아 있음을 알 수 있습니다.

이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.

답변

0

인터넷을 통해 모두 볼 수 있습니다. 어쨌든, 나는 이러한 문제를 겪는 다른 사람들을 위해 내 사이트에서 내 코드를 남겨 둘 것입니다.

내 코드에는 두 가지 문제가있었습니다. 하나는 WinMaker에 전달하기 전에 실제로 새 ControllGL을 만들어야했습니다. 내가 그것을 한 후에 모든 문제를 해결했습니다. 문제가 해결 된 후에는 스레드 당 하나의 렌더링 컨텍스트 만 가질 수 있다는 것을 배워야했습니다. 따라서 다른 스레드에서 호출 되었기 때문에이 두 줄을 내 스레드 함수에 추가해야했습니다. 내가 그것을 모두가 일한 한 후

::wglMakeCurrent(this->hdc, this->hglrc);


this->hglrc = ::wglCreateContext(this->hdc);. 일단 위의 URL에 내 주석 코드를 얻은 후에는 더 많은 것을 만들 수 있습니다.

0

사용자의 ControllerGL 인스턴스가 기능 initializeApp에서 돌아 오면 범위를 벗어나 멤버 데이터에 액세스 할 수 없게됩니다. 추락하지 않으면 순수한 행운입니다. ControllerGLWinMaker 클래스의 구성원으로 유지하십시오.

+0

WinMaker.h의 Line 23에는 ControllerGL * graphixGL이 포함되어 있으며 CreateWindowEx()에서 USERDATA로 사용됩니다.또한 main.cpp의 ControllerGL cntrl을 전역 범위로 이동하려고했습니다. 내 스레드 함수 내에서 멤버 변수를 사용하려고 할 때마다 여전히 충돌이 발생합니다. 나는 당신의 의견에 동의한다. 그것은 범위를 벗어나야한다. 왜냐하면 그 이후로 충돌이 발생하는 이유, 또는 왜 루프가 멈추는지를 완벽하게 만든다. 나는 당신의 제안 된 변화를 만들었지 만, 그것은 여전히 ​​계속됩니다. 내 업데이트 코드를 http://99.116.251.16/code/WIN32/Vers2/에 게시하겠습니다. 약 1 분만 내놔. –

0

나는이 그것을 생각 해달라고,하지만 당신은 창 크기를 조정하면

(this->wndHeight) 

는 0이 될 수 있습니다. 일반적인 safegaurd는 이미 위의 라인 그렇게 될 initialzed되어 실행중인 루프에서

glEnable(GL_DEPTH_TEST); 

이 1

0 경우 추가하는 것입니다.

아마도 실수로 복사본 생성자를 호출하고 얕은 복사본을 가지고 있을까요?

+0

Hello Enabren, 그래서 코드를 수정했는데 루프가 작동하지 않아서 main.cpp 내부에서 ctrl을 인스턴스화해야 WinMaker.cpp에 전달했습니다. 업데이트 된 버전은 http://99.116.251.16/code/WIN32/Vers2/에서 확인할 수 있습니다. 몇 가지 이유 때문에 OpenGL 함수를 창에 그리지 못하기 때문에 멈추었습니다. 이전 작업 버전이 있습니다.이 버전은 http://99.116.251.16/code/WIN32/Vers1/에서 찾을 수 있습니다. 여기에 최종 결과가 있습니다. 256X256을지나 정점 수를 늘리면 느려지는 것입니다. 어쨌든 누군가가 나를 이해하는 데 도움이 될 수 있다면 ... –

+0

Windows GDI와 어떻게 결혼 했습니까? GLUT는 플랫폼에 독립적이며 저에게 덜 불행을줍니다. 그러나 GLUT에서 다시 구현하는 것은 너무 많은 작업 일 수 있습니다. 주제에서 벗어남, 탭 상태가 좋지 않습니다. 개인적 취향대로 나는 "탭 손상"을 방지하기 위해 4 칸에 부드러운 탭을 제안합니다. – EnabrenTane