3

SharpDXにはRenderLoop、レンダリングループで特定のデリゲートを実行するがあります。

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

私がする必要があるのは、なんとかしてレンダリングループを終了することです。

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

returnそれは現在のループの反復を終了するだけなので、私はただできません。

4

5 に答える 5

0

あなたはそれを処分することができます:

myDXControl.Dispose();

コントロールを破棄すると、レンダリングループが停止します。ループを再開するには、ループが破棄されていることを確認してから myDXControl.IsDisposed、コントロールを再初期化し、ループを最初からやり直します。

于 2014-12-05T11:44:58.140 に答える
0

私もこの問題に直面したので、SharpDXのソースコードを調べて解決策を見つけました。

以下は、Runメソッドのソースコードです。

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();
}

継続するwhile条件があります。その条件を変更するだけで十分です。次のコードを使用して静的クラスを作成することをお勧めします。

private static bool mExitLoop = false;

public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false)
{
    if (form is null)
        throw new ArgumentNullException(nameof(form));

    if (renderCallback is null)
        throw new ArgumentNullException(nameof(renderCallback));

    Contract.EndContractBlock();

    form.Show();

    using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents })
    {
        while (renderLoop.NextFrame() && !mExitLoop)
            renderCallback();
    }

    mExitLoop = false;
}

public static void ExitLoop()
{
    mExitLoop = true;
}
于 2017-09-09T22:38:14.930 に答える
-1

アプリケーションを終了する必要があります(Application.Exit)。

または、ループの外側、ループの内側で実行したいジョブを実行することもできます。

于 2012-04-05T22:50:49.277 に答える
-1

RenderLoop考えられる解決策は、レンダリング先のコントロールを破棄することです。

例えば、

RenderForm.Close();
于 2014-03-01T05:57:06.357 に答える
-2

最初のポスターの1つが示しているように、コードはループ内でかなり単純です。呼び出した関数は便宜上のものであり、実際にはフォームで自分の役割を演じることができます。ライブラリを再コンパイルする必要はありません。必要な終了トリガーがapplication.exitだけでない場合は、フォームに関数を追加するだけです。

于 2018-02-04T20:41:38.787 に答える