使用OpenTK进行异步图像绘制

时间:2012-10-28 16:40:41

标签: c# asynchronous opentk

我有一个场景,我执行了一些命令。让我们假设我想做一个模拟和它的每一步,我可以这样做。

private void button4_Click(object sender, EventArgs e)
{
    commands[global++].Execute(ref area.heightMap, ref sim);
    glControl1.Invalidate();  //openTK redrawing
}

单击该按钮将显示场景中的每个步骤。 但现在我想看到一个连续的模拟,我可以这样做。

private void button1_Click_1(object sender, EventArgs e)
{
    for (int i = 0; i < commands.Count; i++)
    {
       button4_Click(null, null);
       Thread.Sleep(100);
    }
}

但效果并不像我想的那样,所有命令都被执行,最后显示的是图像。所以问题是如何显示此模拟的每个步骤(在每个执行命令之后)。 额外的问题 - 假设这个Execute()包含许多小步骤。如何显示所有这些小步骤?

1 个答案:

答案 0 :(得分:0)

您必须在另一个线程上执行命令(您可以使用TPL)并在工作线程中等待,但在UI线程中您必须只能使控件无效。

foreach(var command in commands)
{
    Task<int>.Factory.StartNew(ExecuteCommand)
        .ContinueWith(
            t => Invalidate(t.Result),
            CancellationToken.None,
            TaskContinuationOptions.PreferFairness,
            TaskScheduler.FromCurrentSynchronizationContext());
}


private void Invalidate(int heightMap)
{
    area.heightMap = eightMap;
    glControl1.Invalidate();
}

private int ExecuteCommand()
{
    // returns new heightMap, because it's executes in non-UI thread
    // you can't set UI control property
    return Execute(area.heightMap, sim);
}