私はいくつかの機密LWJGLコードを作成していますので、他のコードを実行する前に自分のディスプレイとGLコンテキストを作成する必要があります。以下を取り、私の現在の苦境の明確な例を与えることを続行する前に強制終了する方法
:
public static void main(String[] args) {
GLDisplay display = new GLDisplay();
display.start();
GLShader shader = new StaticShader();
}
私のGLの創造の初めは別々スレッドが作成されdisplay.start()
、中に発生し、別のスレッドの中に、私のディスプレイが作成されます。
これは問題がどこにあるかを除いて、私は別のスレッドでそれを持っています。だから、私のプログラムは続行し、プログラムを壊すより多くのGLコードを呼び出すnew StaticShader()
を時期尚早に実行し始めます。 (表示が作成される前に実行できません)。私がやろうとしている何
、私はすでにを持っていますが、何かがある前にstart()
方法が完全と呼ばれていることを確認してくださいれ、同時に2つのスレッドを達成しています。ここで
は、startメソッドがどのように動作するかです:
public synchronized void start() {
Threader.createThread(this, "GLDisplay");
}
@Override // public class GLDisplay extends Runnable
public void run() {
// GL code goes here.
}
そして、ここではThreader
です:
public static void createThread(Runnable behaviour, String name) {
new Thread(behaviour, name + behaviour.hashCode()).start();
}
今、あなたはよく私は「一つだけの試み厥、startメソッドでキーワードに気づくことveは役に立たなかった。私も(私は実際には別のStackOverflowの答えから取得する)次のことを試してみた:
@Override
public void run() {
synchronized(this) {
// GL code
}
}
を私はStackOverflowの他の回答をチェックしましたが、どちらかはそれらを理解していないか、私の場合で私を助けていません。最初のコードブロックを使って私はメインメソッドを提供しています。つまり、コードを使用している人に自分のコードを見せたいのです。私はそれを隠すためにGlDisplay
の内部にスレッドの作成を入れようとしています。
アイデア
編集:
プログラムの全体のための表示を更新whileループがあるので、私は単純に(Thread.join()
で)のいずれか閉鎖するGLDisplay
のを待つことはできません。
これが私がマルチスレッド化した理由です。私がプログラムで他のことをしている間、この永遠に終わるループを走らせること。スレッドを閉じると、ループを閉じて表示をクリーンアップし、GLコンテキストをメモリから解放します。もう一度、既存のコンテキストがないためシェーダコードが失敗します。
これを順番に実行する必要がある場合、なぜ別のスレッドで実行するのですか? – QBrute
@QBruteまあ、私はすべてのGLコンポーネントをメインスレッドに保存し、必要に応じて表示スレッドに入力します。したがって、ディスプレイを作成することにより、2番目のスレッドを作成します。**後で、**コンポーネントは「オンザゴー」で追加できます。 – finnrayment
シェーダインスタンスをディスプレイに渡すことはできますか? –