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 に答える