2017-01-02 297 views
1

ここには2つのループがあります。最初のループは数秒間グラフィックスを処理し、その後コードは2番目のループに移動します。最初のループでグラフィックイベントをglutMainLoopEventで処理します。 2番目のループが始まる前に、グラフィックウィンドウを閉じたいと思います。コマンドglutLeaveMainLoopはウィンドウを閉じることができないようです。最初のループの直後にウィンドウを強制的に閉じるために使用する他の関数は何ですか? http://freeglut.sourceforge.net/docs/api.php#EventProcessingOpenGLウィンドウを閉じるには

でfreeglutのドキュメントから[OK]を

#include <stdio.h> 
#include <GL/freeglut.h> 
#include <boost/thread/thread.hpp> // for sleep 

void cback_render() 
{ 
    if(!glutGetWindow()) 
     return ; 
    static float rotations = 0; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 
    glRotatef(rotations, 0, 0, 1); 

    glBegin(GL_TRIANGLES); 
     glVertex3f(0,0,0); 
     glVertex3f(1,0,0); 
     glVertex3f(0,1,0); 
    glEnd(); 

    glutSwapBuffers(); 

    if (++rotations > 360) rotations -= 360; 
} 

void timer(int) 
{ 
    if(!glutGetWindow()) 
     return ; 
    glutPostRedisplay(); 
    glutMainLoopEvent(); 
    glutTimerFunc(30, timer, 1); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(512, 512); 
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); 

    glutCreateWindow("freegluttest"); 
    glutDisplayFunc (cback_render); 
    glutTimerFunc(30, timer, 1); 

    long i=0; 
    while(glutGetWindow() && i< 30) 
    { 
     printf("[%ld]\n",i); 
     i++; 
     glutMainLoopEvent(); 
     boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 
    } 
    glutMainLoopEvent(); 

    glutLeaveMainLoop(); // does not work 
    glutMainLoopEvent(); 

    // do something else .... 
    while(1) 
    { 
     // other calculations 
     boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 
    } 

    return 0; 
} 
+0

このglutまたはfreeglutですか?私はglutタグと混同しています。 – CroCo

+0

@CroCo、言及してくれてありがとう。 – ar2015

+0

私はfreeglutに慣れていませんが、 "glutLeaveMainLoop()"を終了した後、この "glutMainLoopEvent()"を呼び出すのは正しいですか?また、xマークボタンをクリックしてウィンドウを終了しようとしましたか? – CroCo

答えて

0

それはglutMainLoop()ないglutMainLoopEvent()によって開始された場合は、glutLeaveMainLoop()を使用している機能は、単に供給過剰のメインループを停止することです。

あなたの例でループを自分で制御しているので、glutLeaveMainLoop()は何もしません。

glutのメインループを離れることを意図しています。

あなたが100msの睡眠で終わりwhile(1)を持っているので、すべてのフレームがレンダリングされた後、それはそこに着くとき、アプリは他に何もしません。ウィンドウを破壊したい場合は、glutDestroyWindow()のようなウィンドウ関数を使います。

+0

'glutDestroyWindow()'はコールバックを追加するためのものだと思います。私はそれが窓を破壊するとは思わない。 2番目のループは私のプログラムが別の計算を行うことを意味します。私は2番目のループを削除することはできません。私は厳密にプログラムを終了することなくウィンドウを閉じる必要があります。 – ar2015

+0

あなたはあなたのGLUTのバージョンを確認していますか?このリンクをチェックすると、 'glutDestroyWindow()'関数が私の考えとまったく同じであると言います。 https://www.opengl.org/resources/libraries/glut/spec3/node19.html – Harish

+0

申し訳ありませんが、私は間違いました。コードは以下を使って動作しました: 'if(glutGetWindow()) \t \t \t glutDestroyWindow(glutGetWindow()); \t glutMainLoopEvent(); \t glutMainLoopEvent(); ' – ar2015

関連する問題