0

我有一个场景,我在上面执行一些命令。假设我想做一个模拟,它的每一步,我都可以那样做。

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() 包含许多小步骤。如何显示所有这些小步骤?

4

1 回答 1

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);
}
于 2012-10-28T16:54:26.570 回答