0

速度をダイヤル形式で表示するユーザー コントロールがあります (画像)。

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 つの値を立て続けに送信するとロックされます... 実行中のスレッドを中断して値を変更するにはどうすればよいですか?

(また、速度を変更するコードが悪いと思います-もっときれいにできますか?)

4

1 に答える 1

1

そうしない。ロックを使用して適切な方法で処理し、値を変更する必要があるかどうかを確認します。あなたはそれを中断しません。

基本的に、一方が他方をブロックするように、SetSpeed メソッドと Refresh メソッドの間にロック領域が必要です。次に、速度を設定し、スレッドが現在重要な領域にある場合、更新が完了するまで待機します。

そして、あなたの UpdateSpeed は意味がありません - 変更 (対気速度 - および対気速度++) はタイマー駆動でなければなりません...現在、プロセッサの速度に応じて「任意の」速度で変更しています。タイミングがありません。

于 2013-01-07T08:04:00.843 に答える