私には、走っている人をシミュレートするという使命があります。
1 つは 300 秒ごとに 2 ステップを実行し、もう 1 つは y 秒で x ステップを実行します。
完全な解決策は望んでいませんが、どのメカニズムがこれに適しているのか、そしてその理由を知りたいだけです。
ps - 最初はタイマーを使用することを考えましたが、2 回目のレースでは十分ではありません。
私には、走っている人をシミュレートするという使命があります。
1 つは 300 秒ごとに 2 ステップを実行し、もう 1 つは y 秒で x ステップを実行します。
完全な解決策は望んでいませんが、どのメカニズムがこれに適しているのか、そしてその理由を知りたいだけです。
ps - 最初はタイマーを使用することを考えましたが、2 回目のレースでは十分ではありません。
必要なのは、特定の時間に各ランナーが移動した距離を計算する式だけです。
runner[n].StepsTraveled = secondsPassed * (runner[n].StepsPerSecond);
更新間隔に関係なく、常に正確な移動距離が得られます。任意の解決タイマーを使用することも、ボタンをクリックするたびに更新することもできます。
また、マルチスレッドも必要ありません。
マルチスレッドが必須の場合、各スレッドは次の構造を持つことができます。
var runner = this runner for the thread;
while(running)
{
Thread.Sleep(runner.Seconds * 1000); // convert to milliseconds
runner.StepsTraveled += runner.Steps;
}
また、ランナーごとに同じスレッド コードを使用できます。変更する必要があるのは、ランナーがrunner
使用するオブジェクトだけです。
すべてのオブジェクトを移動させる独自のRace
(またはWorld
) クラスを作成します (おそらく、それらが を実装しているためIMoveable
)。次に、このクラスにはメソッドIncrementTime()
(およびおそらくIncrementTime(TimeSpan timeToElaps)
) もあります。このメソッドが呼び出されるたびに、すべてIMoveable
のから取得され、経過時間とオブジェクトの速度に応じてSpeed
変更されます。Position
このアプローチを使用すると、現実世界の時間から独立し、必要に応じてシミュレーションをより速くまたはより遅く実行することもできます。Timer
それでも、アプリケーション内で規則性をトリガーする何らかの種類が必要ですがIncrementTime()
、実行する必要があるリアルタイムに影響を与えることは非常に簡単です。
必要な構成要素は次のとおりです。
メソッドで 1 人のランナーのレースを表現する。2 つの異なるメソッドを使用しないようにするには、共通のコードを因数分解して、速度のパラメーターを渡すことができます。
2 つのランナー レースの同時実行を表すには、新しいコンテキストで各メソッドを実行する必要があります。System.Threading.Thread
時間の経過を表すには、Thread.Sleep
メソッドを使用します
メイン スレッドの待機を表すには (レフリーを表すとします)、次のThread.Join
メソッドを使用します。
何も見逃していないことを願っています...
バックグラウンドワーカーを使用できます。「進行状況が変更されました」イベントにより、GUIを簡単に更新して「ランナー」を表示できます
マルチスレッドは必要ありません。単に 2 つのタイマーを使用します: 300 / 2
s とy / x
seconds です。または、本当に必要な場合は、2 つのスレッドを作成し、最初に 300 を待ってから 2 ステップ (または均等に 150 秒と 1 ステップ) を実行し、次に 1 ステップを待ってx / y
実行します。