2011-07-09 10 views
0

私は仕事があります。私はいくつかの乱数を持っていて、この数の値を含んでいて、遅れています。マルチスレッドプログラミング

遅延とは、この遅延(秒)後にこの数値が更新される(値と遅延)ことを意味します。

私がする必要があることは、次にあることです。たとえば、5つの数字があります。それらのすべては同じ形になっています。したがって、プログラムを開始するときには、最初の数値を取得し、遅延を取得し、この数値のThread.Sleep(遅延)を実行し、更新してから2番目の数値を取得し、遅延などを取得する必要があります。それが最後のものに達すると、最初の番号をもう一度、次に2番目の番号を取得する必要があります。ループのように。

新しいスレッドです。だから誰かが私にどのように動作すべきか説明することができますか?

私はメインフォームを持っているので、私は5つのUserControlsを持っています(リスト<でそれらを保持します)。各コントロールにはUpdateNumber()メソッドがあり、現在の番号の値と遅延を更新します。メインフォームで何をすべきですか?スレッド[]配列を作成する必要がありますか?次に、各UserControlをそこに配置しますか?その後、それらのすべてを起動し、何とか監視しますか?

スレッドについてよく分かりますか。しかし、私にとっては初心者にとってはかなり複雑です。

P.S.私は次の仕事に必要なものよりも。それは同じですが、この数字はすべて別々に働きます。例えば、最初の数字には最初の5秒の遅れがあります。 5秒遅れに達すると、それ自体が更新されます。 2番目の数字と他のすべての数字は同じです。

答えて

2

私はスレッドを作成し、Thread.Sleep()を使用しないでください。各スレッドは、作成するための高価なリソースであり、大半の時間は眠ってしまいますので、ほとんどの時間が無駄になります。また、CPUが飽和している可能性があるため、実行時にコンテキスト切り替えが発生する可能性があります。

代わりに、System.Threading.Timerを使用することを検討します。たとえば、最初にTimerを最初の値で操作するように設定します。この操作が完了したら、TimerTimer.Change()などを使用して次の値を読み取るコードを実行するように '遅延'を使用します。私はあなたの要求を完全に理解しているかどうかはわかりませんが、Timerを使用してそれらのほとんどを満たすことができるように思えます。 Timerは、ThreadPoolを使用します。これにより、不要なスレッドの作成とコンテキストの切り替えが回避されます。

マルチスレッドの詳細については、Jeffrey Richterの書籍CLR via C#(パートV)を強くお勧めします。マルチスレッドは非常に強力ですが、完全に間違ってしまうのは信じられないほど簡単です。 IMHOマルチスレッドコードを書いてみたい人は、少なくとも起動前にこのような良いテキストを読んでください。

+0

OPには「メインフォーム」が含まれているので、Windows.Forms.Timerを使用するほうがいいでしょう。 GUIでの呼び出しの問題を回避します。 –

+1

@Henk:私はまだ 'System.Threading.Timer'を使い、それを必要とする操作、つまりコントロールを読み書きするためのGUIスレッドしか使用しません。問題は、何らかのビジネスロジックに数値を使用するなど、非GUI関連の処理の程度を明らかにしていませんが、非GUIスレッドでこれを実行し、GUIベースのスレッドのみを分離する方が良いと思います。 GUIスレッド上で明示的に呼び出されます。これにはより多くのコードが含まれていると私は認めますが、アプリケーションが成長するにつれてGUIを応答し続けるのに役立ちます。 –

0

私が読んだことだけに基づいて、私はスレッドをまったく使用する魅力的な理由は見当たりません。私はあなたがちょうどある時間間隔に基づいて異なる乱数を生成していることを意味するので、おそらくCPUを集中させることはできません。それぞれUserControlSystem.Windows.Forms.Timerを使用してください。 Tickイベントハンドラが実行されると、次の番号が生成されます。

それぞれUserControlを別のスレッドで実行することをお勧めしますかどうかを尋ねる場合は、答えはほとんどありません。 FormControlを含むすべてのUI要素は、特別に指定されたUIスレッドで実行する必要があります。これは必須です。フリーのスレッドで正しく動作しません。

Thread.Joinについては、とにかくUIスレッドではこれを試してはいけません。UIスレッド上でJoinを呼び出すと、Windowsのメッセージディスパッチメカニズムがブロックされます。 UI全体がハングアップしたように表示されます。

関連する問題