2012-02-09 33 views
0

私は幾重にも重い物理計算をする予定のCプロジェクトで作業しています。終了したら結果を見ることができます。現在の動作は、メインスレッドでGLUTを実行し、別のスレッド(pthread)を使用して入力(端末から)と計算を行うことです。私は現在、glutTimerFuncを使ってアニメーションを行っていますが、問題はその関数が何らかの関係でいつもインターバルを発生させるということです。私はアニメーション機能でifステートメントを使用してアニメーションを停止することができますが、変数をupdatetから停止しますが、これは多くの不要なリソースを使用します(私は思っています)。GLUTアニメーションの開始と停止

この問題を解決するために、自分自身を制御できるカスタムタイマー機能を備えた余分なスレッドを使うことができると考えていました(glutMainLoopを使いこなすことなく)。現在、これが機能するかどうかを調べるためのテスト関数です(関数自体は決して終わっていないということです)。それはちょうどglutMainLoop前に別々のスレッドで実行さcreatet:私が持っている

void *threadAnimation() { 
    while (1) { 
     if (animationRun) { 
      rotate = rotate+0.00001; 
      if (rotate>360) { 
       rotate = rotate-360; 
      } 

      glutSetWindow(window); 
      glutPostRedisplay(); 
     } 
    } 
} 

具体的な問題は、アニメーションがわずか数秒のカップルのために実行した後、停止していることです。誰も私がこれをどのように修正できるか知っていますか?私はタイマなどを後で使用する予定ですが、私が探しているのは、glutPostRedisplayが正しい場所に確実に送信されるようにする方法です。私はtoutt glutSetWindow(ウィンドウ)は解決策でしたが、明らかにそうではありませんでした。もしglutSetWindow(ウィンドウ)を削除しても、アニメーションはまだ機能していますが、長時間ではありませんが、はるかに速く実行されます(glutSetWindow(ウィンドウ)は多量のリソースを必要としますか?)

btw変数 "window" :

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
glutInitWindowSize(854, 540); 
glutInitWindowPosition(100, 100); 
window = glutCreateWindow("Animation View"); 
init(); 
glutDisplayFunc(display); 
glutReshapeFunc(reshape); 
timerInt = pthread_create(&timerThread, NULL, &threadAnimation, NULL); 
glutMainLoop(); 

これが正しいかどうかは実際には分かりませんが、うまくコンパイルされます。どんな助けも大いに魅力的です!ここで

答えて

0

は、すべての動的な設定が含まれていますクラスを作成し、少し考えです:

class DynamicInfo { 
    public int vertexCount; 
    public float *vertexes; 

    ... 

    DynamicInfo &operator=(const DynamicInfo &origin); 
}; 

、メインアプリケーションは、これらの含まれていますより:おそらくいくつかのスレッドを使用する(だけで描くアニメーションスレッドで

DynamicInfo buffers[2]; 
int activeBuffer = 0; 

1つの変数の変数):

DynamicInfo *current = buffers + activeBuffer; // Or rather use reference 

計算中:

// Store currently used buffer as current (for future manipulation) 
DynamicInfo *current = buffers + activeBuffer; 

// We finished calculations on activeBuffer[1] so we may propagate it to application 
activeBuffer = (activeBuffer + 1)%2; 

// Let actual data propagate to current buffer 
(*current) = buffers[activeBuffer]; 

もう一度変数をロックしています。

関連する問題