2017-07-11 7 views
0

私はいくつかの機密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コンテキストをメモリから解放します。もう一度、既存のコンテキストがないためシェーダコードが失敗します。

+0

これを順番に実行する必要がある場合、なぜ別のスレッドで実行するのですか? – QBrute

+0

@QBruteまあ、私はすべてのGLコンポーネントをメインスレッドに保存し、必要に応じて表示スレッドに入力します。したがって、ディスプレイを作成することにより、2番目のスレッドを作成します。**後で、**コンポーネントは「オンザゴー」で追加できます。 – finnrayment

+0

シェーダインスタンスをディスプレイに渡すことはできますか? –

答えて

1

java.util.concurrent.CountDownLatchを使用すると、他のスレッドの操作が完了するまでスレッドを待機させるのに役立ちます。何をどのように使用するかについての参照を参照してください。

あなたGLDisplayのスレッドで
public static void main(String[] args) { 

    CountDownLatch cdl = new CountDownLatch(1); 

    // pass the CountDownLatch into display 
    GLDisplay display = new GLDisplay(cdl); 
    display.start(); 

    // wait for the latch to have been counted down in the disp thread 
    try 
    { 
     cdl.await(); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 

    GLShader shader = new StaticShader(); 
} 

、まあ、私はとにかく二つの別々のスレッドに対するGLコードを持っていないことを今覚えているが、ザッツたCountDownLatch

+0

JavaDocの始まりはちょうど**私が必要とするものを説明しています。私はこれを読むことができます、私は瞬間ではありません。 :) – finnrayment

+0

こんにちは。これは、私がセカンダリスレッド内にシェーダオブジェクトを格納する必要はありませんか?私はそれをプログラムのメインスレッドの中に入れておく必要があります。 – finnrayment

+0

セカンダリスレッドにシェーダを保持する必要はありません。セカンダリスレッドにラッチを渡す必要があります。また、実行中の任意の時点でセカンダリのラッチのcontDown()メソッドを呼び出して、メインスレッドが再開を開始することを示すことができます。 – OTM

0
私は何かを誤解される可能性があります

が、次のことを試してください。

public static void createThread(Runnable behaviour, String name) { 
    Thread t = new Thread(behaviour, name + behaviour.hashCode()).start(); 
    t.join(); 
} 

(参加呼び出すことにより)プログラムが完了するまでスレッドを待つ必要があります。

+0

うん、いいえ!その表示スレッドは私のウィンドウ全体です!それがなければ、プログラムは存在しなくなります。おそらく、プログラムサイクルの**全体**のためにそのスレッド内で実行されるメインループがあるはずです。私を許してください。 – finnrayment

+0

そのスレッドが終了すると、GLコンテキストは再び失われます。 – finnrayment

+0

ああ、私はちょっと混乱していると思うし、大変助けになることができなかったのは残念だ。実際に必要とするのは、プログラムが動く前に表示スレッド内の 'Threader' ** separated **スレッドです。 – Eduardo

0

countDownメソッドを呼び出しますポイントのほかに。

私は実際にどのthreadlockクラスか何かを使用する必要はありませんが、むしろちょうどこのような単純な何かを行うことができます:threadlockが第二のスレッドに到達し、解放され

private Boolean threadLock = true; 
public void start() { 
    Threader.createThread(this, "GLDisplay"); 
    while (true) { 
     synchronized(threadLock) { 
      if (!threadLock) break; 
     } 
    } 
} 

@Runnable 
public void run() { 
    // Do GL code. 
    synchronized(threadLock) { threadLock = false; } 
    // Do the rest of whatever I'm doing. 
} 

最初のスレッドは引き続きそのアクティビティを実行します。それは簡単です!

+0

1)ブール値で同期するのはベストプラクティスではありません:https://stackoverflow.com/questions/10324272/why-is-it-not-a-good-練習から同期にブーリアン 2)ビジー・ウェイト・ループを使用して不必要にスピンする理由は何ですか? この文脈では、@OTM回答のCountDownLatchを使用します。 –

+0

@MichaelMarkidisもちろん、メインメソッド内に組み込むことなく、それらを使用する方法が見つからない限り、それらを使用したいと思います。このメソッドは単にそれを隠す*ため、ユーザーがライブラリを実装する必要はありません。私はまだそれを見ている、私はブールの方法が好きではない、そのあまりにも汚い。 – finnrayment

+0

私が言っていたことは、このクラスでCountDownLatchを内部的に使用できることです。 'threadLock'の代わりにラッチを使うだけです。 –

関連する問題