2015-05-25 61 views
2

我正在創建一個opengl應用程序,當我沒有使用多線程時它運行良好。原來的代碼如下所示:如何多線程glfw鍵盤迴調?

void Controller::BeginLoop()  
{  
    while (!glfwWindowShouldClose(_windowHandle)) {  
     /* Render here */  
     Render();  

     /* Swap front and back buffers */  
     glfwSwapBuffers(_windowHandle); 

     /* Poll for and process events */  
     glfwPollEvents(); 
    }  
}  

int main() 
{ 
    //do some initialization 
    g_controller->BeginLoop(); 
} 

上面的代碼工作得很好,但是,當我試圖把eventpolling和渲染成兩個不同的線程,OpenGL的不會畫在窗口任何東西。下面是我用的多線程代碼:

void Controller::BeginLoop()  
{  
    while (!glfwWindowShouldClose(_windowHandle)) { 

     glfwMakeContextCurrent(_windowHandle); 

     /* Render here */  
     Render();  

     /* Swap front and back buffers */  
     glfwSwapBuffers(_windowHandle); 
    }  
}  



void Render(int argc, char **argv) 
{ 
    ::g_controller->BeginLoop(); 
} 

int main() 
{ 

    std::thread renderThread(Render, argc, argv); 

    while (true) { 
     glfwPollEvents(); 
    } 

    renderThread.join(); 

    return 0; 
} 

在渲染功能,我做了一些物理和繪製結果點到窗口。 我完全不知道發生了什麼問題。

回答

2

創建GLFW窗口後,由此創建的OpenGL上下文將在創建窗口的線程中變爲當前。在另一個線程中創建OpenGL上下文之前,必須在當前擁有它的線程中釋放(取消當前)。因此,在新線程調用glfwMakeCurrent(windowHandle)之前,保持上下文的線程必須調用glfwMakeContextCurrent(NULL) - 在啓動新線程之前或通過使用同步對象(互斥量,信號量)。


順便說一句:開始以下劃線_符號被保留用於在全局命名空間中的編譯器,所以無論是確保_windowHandle是一個類的成員變量或使用強調符號只爲函數參數。