4

GTKアプリケーションを作成するために、メインウィンドウに何が表示されるかを説明する一連のコードを作成してから、次のように呼び出します。

gtk_main();

この後のコードステートメントは実行されません。

ここで、GTKアプリに、私がglutで書いたものを表示させたいとしましょう。これには、設定する必要のあるグラフィックスなどに関する一連のステートメントが含まれ、ステートメントで終わります。

glutMainLoop();

これ以降は実行されません。

したがって、私の問題は、これら2つのステートメントのいずれかが、もう一方を呼び出すことができないことです。

  1. GTKウィジェット内で過剰なメインループを実行する方法はありますか?
  2. GTKメインループと過剰メインループの両方を同時に呼び出すことができるコードを書く方法はありますか(ただし、メインプログラムから呼び出され、ウィジェット内ではなく、別のXウィンドウでレンダリングされます)?私はこれが「スレッド」でできると感じています...
4

2 に答える 2

4

あなたはそうしない。一般的には意味がありません。

GLUTは、OpenGLウィンドウを作成および管理するためのライブラリです。GTKにはすでにOpenGLウィンドウがありますGTKを使用している場合は、GLUTを使用しても意味がありません。これは、2つのベクトル数学ライブラリなどを持っているようなものです。

于 2012-05-02T19:45:16.560 に答える
3

メインループを実行しています。が呼び出されるgtk_main()まで実行されます。gtk_quit()

GTK.orgのgtk_main()

gtk_main_quit()が呼び出されるまでメインループを実行します。gtk_main()への呼び出しをネストできます。その場合、gtk_main_quit()は、メインループの最も内側の呼び出しを返します。

また、glutMainLoop()同じように機能し、GLイベントを永久に処理します。

OpenGL.orgのglutMainLoop()

glutMainLoop()GLUTイベント処理ループに入ります。このルーチンは、GLUTプログラムで最大1回呼び出す必要があります。一度呼び出されると、このルーチンは決して戻りません。登録されているコールバックを必要に応じて呼び出します。

したがって、これらの両方を同時に実行することは望ましくありません(互いに干渉する可能性があるため、予期しない結果が生じる可能性があります)。その後、過剰な状態から呼び出す必要がありますgtk_main_iteration()

GTK.orgのgtk_main_iteration()

メインループの単一の反復を実行します。処理を待機しているイベントがない場合、GTK+は次のイベントが通知されるまでブロックします。ブロックしたくない場合は、gtk_main_iteration_do()を確認するか、最初にgtk_events_pending()で保留中のイベントがあるかどうかを確認してください。

さて..GLUTには同等のものがないgtk_main_iteration()ので、GLUTコールバックを登録する必要があります。

すべてのフレームに対してコールバックを実行するgtk_main_iteration()を使用し て実行されるGLUTにコールバックを登録できます--glutIdleFunc() ..glutIdleFunc(void (*func)(void))

または、コールバックを指定して、200ミリ秒ごとglutTimerFunc(unsigned int msecs, void (*func)(int value), value)の戻り値を呼び出して確認することもできます。gtk_main_iteration()

私はおそらく両方を試してみますが、glutIdleFunc()応答性を高めるために定期的に呼び出されるとは限りません。

ただし、 GTKのGLサポートを推進することは本当に検討する価値があります。

于 2012-05-03T07:34:23.720 に答える