2012-02-11 24 views
0

ちょうどGLFWで基本ウィンドウを開こうとしていて、開かれて黒くクリアされている間にハングして、円を待っているカーソルが表示されます。 GUIは使用できず、プログラム全体がフリーズします。OpenGL/GLFW:glfwOpenWindow hanging(ベアボーンアプリケーション)

助けが必要ですか?

EDIT手動でウィンドウを作成し、そのウィンドウにglfwを添付する方法はありますか?

コード:

// Attempt to start up GLFW 
     f1("Attempting to start up GLFW"); 
     if(!glfwInit()) 
     { 
      e("Could not start up GLFW!"); 
      SetVError(V_ERR_OGL_GLFWINIT); 
      return false; 
     } 

     // Create window hints 
     f1("Setting window hints"); 
     glfwOpenWindowHint(GLFW_FSAA_SAMPLES, V_OGL_ANTIALIAS); 
     glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // We want 4.0! 
     glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); 
     glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

     // Create the window 
     f1("Creating main window"); 
     if(!glfwOpenWindow(V_OGL_WINDOW_W, V_OGL_WINDOW_H, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) 
     { 
      e("Could not create main window!"); 
      SetVError(V_ERR_OGL_WINDOW); 
      return false; 
     } 

     // Attempt to start up Glew 
     f1("Attempting to startup Glew"); 
     if(glewInit() != GLEW_OK) 
     { 
      // Error and return 
      e("Could not instantiate Glew!"); 
      SetVError(V_ERR_OGL_GLEWINIT); 
      return false; 
     } 

     // Set the window's title 
     f1("Setting window title"); 
     glfwSetWindowTitle(V_WINDOW_TITLE); 

     // Clear the screen/set BG color 
     f1("Clearing background"); 
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

     // Lastly, setup basic sticky keys 
     f1("Enabling sticky keys"); 
     glfwEnable(GLFW_STICKY_KEYS); 

メインコード:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpComString, int nShowCmd) 
{ 
    // Generate logger instance (instantiate logging) 
    VLogInit(); 

    // Log Title + Version 
    i("VOGL Test "V_FULLVERSION); 

    // Init OpenGL/Graphics 
    if(!OGLStartup()) 
     return GetLastVError(); 
    else // Log that we succeeded 
     f1("OGLStartup succeeded!"); 

    // Fork thread for window events 
    hMainWindow = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&tcbMainWindow, NULL, 0, thMainWindow); 

    // Alloc statuc 
    DWORD status; 

    // Wait for all threads to return 
    while(true) 
    { 
     // Main Window 
     GetExitCodeThread(hMainWindow, &status); 
     if(status != STILL_ACTIVE) 
      break; 

     // Sleep for a little bit 
     Sleep(10); 
    } 

    // All okay! 
    f1("Terminating Program"); 
    return V_SUCCESS; 
} 

DWORD tcbMainWindow(LPVOID lpdwThreadParam) 
{ 
    // Begin window loop 
    do 
    { 

    } // Escape key or window closed 
    while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED)); 

    // Success! 
    return V_SUCCESS; 
} 

そして、はい、すべてが正常にログインしています。 http://pastebin.com/sQ2pw2wN

+0

メインループはどこにありますか?このコードはどこにプログラムに入りますか?また、GLFWには多くの例があります。あなたはそのうちの1人から学ぶことを検討しましたか? –

+0

@NicolBolas - メインコードを追加しました。そして、はい、これはチュートリアル – Qix

答えて

2

あなたはこのように、あなたのメインループに戻って、フロントフレームバッファを交換する必要があります。それはフリーズなぜ

// Begin window loop 
do 
{ 
    glfwSwapBuffers(); // <<< 
} // Escape key or window closed 
while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS 
     && glfwGetWindowParam(GLFW_OPENED)); 

?あなたはglfwSwapBuffers(通常)を呼び出すとき

GLFWは、オペレーティングシステムイベント(ウィンドウをリフレッシュするよう、押され得るキー、...)を管理します。

+0

からかなり多くc/pされています、まだぶら下がっていません。 :C – Qix

+0

いいえ、それはスレッドの問題でした。明らかにOpenGLはスレッドセーフではありません。私が今キャッチしたことは良いことです。これは開発の初期に基本的なスレッドアーキテクチャを再設計するのが容易だったためです。 – Qix

+0

はい、あなたは正しかった! – Qix

関連する問題