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

正如最初的海报之一所示,循环中的代码相当简单。您调用的函数是为了方便起见,您实际上可以在表单中扮演自己的角色。不需要重新编译库,如果 application.exit 不是您想要的唯一退出触发器,只需在表单中添加一个函数。

于 2018-02-04T20:41:38.787 回答