速度をダイヤル形式で表示するユーザー コントロールがあります (画像)。
SetSpeed(int speed); という 1 つのメソッドがあります。
次に、最後に設定した速度から、希望の速度までダイヤルを動かします。その後、段階的に行います。つまり、新しい速度に移動します。
問題は、車が時速 10 km で (非常に速く) 時速 100 km に達した場合、ダイヤルがその速度に達するまでにおそらく 2 秒かかることです... (これは 100% リアルタイムではありません。これは現実的です . . 新しい速度に移動します)。
しかし、ダイヤルが 100km/h に達する前に人が 50km/h に減速した場合、100 までの移動を中断し、50 まで移動を開始する必要があります。ダイヤルの現在の位置 (速度ではない) に関係なく、私は「目標速度」を変更する必要があります。
私のコントロールは、更新を処理するために BackgroundWorker を使用しており、UI をロックしていません。
したがって、UI からの私の呼び出しは非常に基本的です。
dial1.SetSpeed(int.Parse(value));
そして、ユーザーコントロールはこれを行います:
BackgroundWorker bw = new BackgroundWorker();
public void SetSpeed(int speed)
{
while(bw.IsBusy)
{
Thread.Sleep(50);
}
bw.RunWorkerAsync(speed);
}
そして、仕事をする方法:
private void UpdateSpeed(object sender, DoWorkEventArgs e)
{
var oldSpeed = airSpeed;
var newSpeed = (int) e.Argument;
if(oldSpeed <= newSpeed)
{
for (int i = oldSpeed; i < newSpeed; i++)
{
airSpeed++;
this.Invoke(new MethodInvoker(Refresh));
}
}
else
{
for (int i = oldSpeed; i > newSpeed; i--)
{
airSpeed--;
this.Invoke(new MethodInvoker(Refresh));
}
}
airSpeed = newSpeed;
}
2 つの値を立て続けに送信するとロックされます... 実行中のスレッドを中断して値を変更するにはどうすればよいですか?
(また、速度を変更するコードが悪いと思います-もっときれいにできますか?)