0

私は物理エンジンとディスプレイを備えた小さなアプリケーションを構築しました。ディスプレイは、物理エンジンを扱うコントローラーに接続されています(実際はコントローラーを処理するビューモデルですが、詳細)。疑似リアルタイムスレッド

現在のところコントローラはbegin-invokeでアクティブになり、キャンセルトークンで非アクティブ化され、endinvokeによってレアされるデリゲートです。ラムダの内部では、UIを最新の状態に保つPropertyChanged(INotifyPropertyChangedに引っかかります)をブラシします。

私はBeginInvokeメソッドが別のスレッドではなくタスクをアクティブにすることを理解しています(私のコンピュータでは別のスレッドをアクティブにしますが、これは私が行った読書の保証ではなく、スレッドプールまでですタスクを完了したいと思っています)、これは私が行ったすべてのテストからうまくいきます。ラムダは、CancellationTokenが殺されるまで完了しません。それは睡眠と更新を持っています(それはリアルタイムの物理エンジンをシミュレートするようなものです...それは原油ですが、リアルタイムで正確な感覚を必要としません)。

私が持っている質問は、他のコンピュータでも動作するのでしょうか、明示的なスレッドに切り替えて開始し、取り消すべきですか?私が考えているシナリオは、1つのコアプロセッサであり、2番目のタスクでプロセッサ時間が大幅に短縮され、許容できない不正確なモデルになる可能性があります(つまり、マイクロ秒よりもむしろスイッチングする前にミリ秒待っていますか?それとも私がやっていないより良い方法ですか?

+0

これは.NETですか?そうであれば、使用しているプログラミング言語とともに質問にタグを付けることができます。 –

答えて

1

私の経験では、あなたが説明した方法でスレッドプールを使用することは、スレッドを分割する方法を理解する手間を掛けることなく、ほとんどのコンピュータでかなりのパフォーマンスを保証するでしょう。

スレッドはコアと同じものではありません。シングルコアマシンでは複数のスレッドが取得され、それらのスレッドはそれぞれ処理負荷の一部を奪います。スレッドで珍しい何かをしない限り、あなたが記述した "デッドロック"状態にはならないでしょう。

言い換えれば、マイクロ秒はスレッド間のコンテキスト切り替えに時間がかからないため、YMMVです。あなたはそれを試して、それがどれほどうまくいくか見なければなりません。いくつかの微調整が必​​要な場合があります。