- ベストアンサー
2つのスレッドの実行について
お世話になります。 VS2005C#で作成しております。 以下のコードにてスレッドを2つ実行させ、終了を監視する処理を記述しました。 ----------------------------------------------------------------------------------------------------------- isRcvSearchFlg = 0; isFwdSearchFlg = 0; private int SetDataTreeView() { // それぞれのデータ格納処理をスレッドで処理する Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); Thread FwdSetThread = new Thread(new ThreadStart(this.FwdDataSet)); RcvSetThread.Start(); FwdSetThread.Start(); // 両方のスレッドが終了するまで待機する while (isRcvSearchFlg != 1 && isFwdSearchFlg != 1) Application.DoEvents(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* メインフォーム内のDatagidview(1)への値の代入 */ isRcvSearchFlg = 1; } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } delegate void FwdDataSetDelegate(); private void FwdDataGridSet() { /* メインフォーム内のDatagidview(2)への値の代入 */ isRcvSearchFlg = 1; } void FwdDataSet() { Invoke(new FwdDataSetDelegate(FwdDataGridSet)); } ----------------------------------------------------------------------------------------------------------- RcvDataGridSet、FwdDataGridSetでログを出力して、進行状況を監視しておりますが、どうも2つのスレッドが同時に走っていないようなのです。 原因として考えられることはございますでしょうか。 また、同時に走らせるコードはありますでしょうか。 お手数ですが、ご教授いただきたく宜しくお願い申し上げます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> Datagidview(1)への値の代入 > Datagidview(2)への値の代入 この2つの処理をマルチスレッドによって同時に進行させたいが、同時ではなく順次に処理されてしまう。質問の意図するところはこのような具合でしょうか。 > 原因として考えられることはございますでしょうか。 まず、『RcvDataGridSet と FwdDataGridSet はどちらもメインスレッドから呼び出されている』という点が重要です。 1つのスレッドから2つのメソッドを呼び出しているので、当然同時ではなく順番に呼び出されます。(どちらが先になるかはわかりませんが、スタート順序から見てRcv側のほうがかなり高い確率で先になると思われます。) 前回の回答で、コントロールのInvokeはメインスレッドからの呼び出しのためにウィンドウメッセージを使用することを説明しました。異なるスレッドからまったく同じタイミングでInvokeを仕掛けても、メッセージキューはひとすじ待ち行列でしかないので、時間的な前後は発生します。そして、メッセージは処理が終わるまで次のメッセージを処理しません。すなわち、先に呼び出したInvokeが処理を終えるまで、次のInvokeは待ち状態になります。 結果的に、やっていることはメインスレッドひとつで2つのメソッドを順に呼び出しているのと変わらなくなります。 これが同時に処理されない原因と思われます。 > 同時に走らせるコードはありますでしょうか。 DatagridViewが別スレッドからの呼び出しに応じない場合、複数のスレッドで同時操作することはできません。 マルチスレッドは処理を並列化する手段ではありますが、コントロールが絡む場合、その恩恵をフルに活用できないことが多いです。
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> どうも2つのスレッドが同時に走っていないようなのです。 その根拠は? > 原因として考えられることはございますでしょうか。 一方が他方をブロックしているとか(その逆も)。
補足
度々のご回答誠にありがとうございます。 >DatagridViewが別スレッドからの呼び出しに応じない場合、複数のスレッドで同時操作することはできません。 再度ご質問なのですが、DatagridViewが別スレッドからの呼び出しに応じる方法はあるのでしょうか。 度々申し訳ありません。 ご回答いただければ幸いです。