dポイントプレゼントキャンペーン実施中!

お世話になります。
C#2005でプログラムを作成しております。

マルチスレッドでの、スレッドの終了の監視のことでご質問させていただきます。

下記のコードを実行すると、問題なく実行されます。

------------------------------------------------------------------------------------
private int SetDataTreeView()
{
Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet));
RcvSetThread.Start();
}

delegate void RcvDataSetDelegate();

void RcvDataGridSet()
{
/* フォーム内のDatagidviewへの値の代入 */
}

void RcvDataSet()
{
Invoke(new RcvDataSetDelegate(RcvDataGridSet));
}
------------------------------------------------------------------------------------

このスレッドの終了を監視したく、下記のコードを追加してデバッグしてみましたが、
スレッドが実行されませんでした。

------------------------------------------------------------------------------------
int isRcvSearchFlg = 0;

private int SetDataTreeView()
{
Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet));
RcvSetThread.Start();

// スレッドが終了するまで待機する
for (; ; )
{
if (isRcvSearchFlg == 1)
{
break;
}
}
}

delegate void RcvDataSetDelegate();

void RcvDataGridSet()
{
/* フォーム内のDatagidviewへの値の代入 */
isRcvSearchFlg = 1;
}

void RcvDataSet()
{
Invoke(new RcvDataSetDelegate(RcvDataGridSet));
}
------------------------------------------------------------------------------------

また、以下も試してみましたが、結果は同じでした。
------------------------------------------------------------------------------------
private int SetDataTreeView()
{
Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet));
RcvSetThread.Start();

// スレッドが終了するまで待機する
RcvSetThread.Join();
}

delegate void RcvDataSetDelegate();

void RcvDataGridSet()
{
/* フォーム内のDatagidviewへの値の代入処理 */
}

void RcvDataSet()
{
Invoke(new RcvDataSetDelegate(RcvDataGridSet));
}
------------------------------------------------------------------------------------

スレッドの終了を監視する方法がわからず困っております。
お手数ですが、ご教授いただきたくよろしくお願い申し上げます。

A 回答 (2件)

> Invoke(new RcvDataSetDelegate(RcvDataGridSet));


これは、別スレッドからフォームを生成したスレッドでの呼び出しと見てよいでしょうか。。。

また、フォーム生成はメインスレッドで行っているものとして説明します。

メインスレッドを停止した状態で、メインスレッドを呼び出すInvokeは使えません。SetDataTreeViewを脱出しなければ、メインスレッドが次の処理(つまりInvokeによる呼び出し)を行えないからです。
Invokeが戻り値を待つ + Invoke先のスレッドが停止している というデッドロックが発生しているのだと思います。

メインスレッドに対するInvokeはウィンドウメッセージを使って呼び出されているので、Application.DoEventsでメッセージキューを優先処理させれば動作すると思います。2番目のコードのforループを次のように書き換えて試してみてください。

while (isRcvSearchFlg != 1) Application.DoEvents();
    • good
    • 1
この回答へのお礼

ありがとうございます。
デットロックせずに実行することを確認できました。

お礼日時:2009/11/29 11:48

BackgroundWorkerを使う方向のほうがいいかもしれませんよ

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!