2012-04-05 8 views
2

これが本当にSharpDXの質問か一般的なC#の質問か分かりません。だから私は何をする必要があるか何とかレンダリングループの出口であるSharpDX RenderLoopを終了する

RenderLoop.Run(m_RenderForm,() => 
{ 
    // Do stuff here to render things... 
} 

SharpDXは、デリゲートを使用して実行されるループをレンダリングしています。それはちょうど、現在のループを終了し、初めに再び開始しているため

RenderLoop.Run(m_RenderForm,() => 
{ 
    if(DoINeedToQuit() == true) 
    { 
     // What do I put here? 
    } 
} 

私は、だけでなく、returnことができます。

答えて

1

あなたはアプリケーション(Application.Exit)を終了する必要があります。もう1つの選択肢は、ループの外側に、ループ内で実行したいジョブを実行することです。

+0

これはかなりです。特にSharpDXでは、 'm_RenderForm.Close()'を使ってフォームを閉じなければなりませんでした。 – Cylindric

0

他のソリューションには、コントロールを破壊する「とは、」renderLoopが働いている、例えば、RenderForm.Close()

0

は、あなたがそれを配置することができます行うことです。

myDXControl.Dispose(); 

ループが停止します。 ループを再開するには、それが廃棄されているかどうか確認することができますmyDXControl.IsDisposedその後、コントロールを再度初期化してループを開始することができます。助けて欲しい

0

SharpDXのソースコードを見て、自分で解決策を見つけることができます。 とにかく、この問題で自分自身を見つけました。私はソースコードを見てきました。それから は、ここRunのコードは次のとおりです。while

public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false) 
{ 
    if (form == null) 
     throw new ArgumentNullException("form"); 
    if (renderCallback == null) 
     throw new ArgumentNullException("renderCallback"); 
    form.Show(); 
    using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents }) 
     while (renderLoop.NextFrame()) 
      renderCallback(); 
} 

継続するための条件があります。示された、コードがループ内で非常に簡単です初期のポスターの一つとして

private static bool cancelLoop = false; 

public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false) 
{ 
    if (form == null) 
     throw new ArgumentNullException("form"); 
    if (renderCallback == null) 
     throw new ArgumentNullException("renderCallback"); 
    form.Show(); 
    using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents }) 
     while (renderLoop.NextFrame() && !cancelLoop) 
      renderCallback(); 
    cancelLoop = false; 
} 

public static void CancelRun() 
{ 
    cancelLoop = true; 
} 
0

:あなたはそこにand演算子を追加することができます。呼び出された関数は便宜上のものであり、実際にはフォーム内で独自の役割を果たすことができます。ライブラリを再コンパイルする必要はありません。application.exitが唯一の終了トリガーでない場合は、フォームに関数を追加してください。

関連する問題