我想讓線程在我的OpenGL程序中運行。現在我正在製作一個原型以呈現給我的小組。從本質上講,我必須使用Win32 API中的:: PeekMessage()函數渲染大片地形,產生波濤洶涌的結果。因此,我試圖獲得一個渲染線程來運行,將不斷呈現,而主線程處理所有的輸入。我有線程正確啓動,但不知何故它過早死亡。我無法弄清楚我的代碼在造成什麼。我的代碼基數很小,所以對於有這方面工作經驗的人來說,我認爲它不應該很難診斷。整個代碼由3個源文件組成,不超過100行,可以在這裏找到。Win32 API渲染線程和OpenGL
http://99.116.251.16/code/WIN32/Vers2/
具體來說,我的問題出現在ContrllerGL.cpp行號21 - 76那代碼如下:
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);
}
在功能我的迴路標誌是真實的頂部
不知何故,但不知何故,當它進入循環時,它的計算結果爲false。它應該中斷的唯一原因是因爲產生它的主線程終止。但是,如果您編譯該程序,則會看到主窗口仍然存在。
任何幫助,將不勝感激。
WinMaker.h的第23行包含一個ControllerGL * graphixGL,它在CreateWindowEx()中用作USERDATA。我也嘗試將main.cpp中的ControllerGL cntrl移動到全局範圍。每當我嘗試在我的線程函數中使用成員變量時,我仍然崩潰。不過,我同意你的看法,它必須超出範圍,這是完美的,因爲它爲什麼崩潰,或爲什麼循環停止。我提出了你的建議改變,但它仍然是一個不行。讓我發佈我的更新代碼到http://99.116.251.16/code/WIN32/Vers2/。給我1分鐘左右就能搞定。 – 2010-12-18 23:36:09