我有一个场景,我执行了一些命令。让我们假设我想做一个模拟和它的每一步,我可以这样做。
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()包含许多小步骤。如何显示所有这些小步骤?
答案 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);
}