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로 평가됩니다. 왜 깨뜨려야만하는 유일한 이유는 그것이 생성 된 주 스레드가 종료 되었기 때문입니다. 그러나 프로그램을 컴파일하면 주 창이 아직 살아 있음을 알 수 있습니다.
이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.
WinMaker.h의 Line 23에는 ControllerGL * graphixGL이 포함되어 있으며 CreateWindowEx()에서 USERDATA로 사용됩니다.또한 main.cpp의 ControllerGL cntrl을 전역 범위로 이동하려고했습니다. 내 스레드 함수 내에서 멤버 변수를 사용하려고 할 때마다 여전히 충돌이 발생합니다. 나는 당신의 의견에 동의한다. 그것은 범위를 벗어나야한다. 왜냐하면 그 이후로 충돌이 발생하는 이유, 또는 왜 루프가 멈추는지를 완벽하게 만든다. 나는 당신의 제안 된 변화를 만들었지 만, 그것은 여전히 계속됩니다. 내 업데이트 코드를 http://99.116.251.16/code/WIN32/Vers2/에 게시하겠습니다. 약 1 분만 내놔. –