

お世話になります。
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));
}
------------------------------------------------------------------------------------
スレッドの終了を監視する方法がわからず困っております。
お手数ですが、ご教授いただきたくよろしくお願い申し上げます。
No.1ベストアンサー
- 回答日時:
> Invoke(new RcvDataSetDelegate(RcvDataGridSet));
これは、別スレッドからフォームを生成したスレッドでの呼び出しと見てよいでしょうか。。。
また、フォーム生成はメインスレッドで行っているものとして説明します。
メインスレッドを停止した状態で、メインスレッドを呼び出すInvokeは使えません。SetDataTreeViewを脱出しなければ、メインスレッドが次の処理(つまりInvokeによる呼び出し)を行えないからです。
Invokeが戻り値を待つ + Invoke先のスレッドが停止している というデッドロックが発生しているのだと思います。
メインスレッドに対するInvokeはウィンドウメッセージを使って呼び出されているので、Application.DoEventsでメッセージキューを優先処理させれば動作すると思います。2番目のコードのforループを次のように書き換えて試してみてください。
while (isRcvSearchFlg != 1) Application.DoEvents();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドの終了の仕方
-
DirectX キーが入力されるまで...
-
WaitForSingleObjectの使い方に...
-
スレッド一覧の取得
-
C# スレッド終了の監視について
-
msec単位のWait Timerが作れない!
-
複数スレッドを動作させるのに...
-
スレッドにて同一メモリの書き...
-
スレッド内のCString使用
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
TCP/IP通信時のサーバーからの受信
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
家電製品の電力周波数を変える機械
-
vba listviewにおけるtextのAli...
-
メモリーリークエラーが起こる
-
php
-
VCでウエイトをミリ秒でかけ...
-
ACCESS側からEXCELの書式を設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
複数スレッドを動作させるのに...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
同一スレッドで、ロックをかけ...
-
マルチスレッド内のループについて
-
sleep関数とは?
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
CWnd::OnTimerのスレッドの取得
-
C言語である関数への同時アクセ...
-
別スレッドのデータを受信できない
-
VB2005 シリアル通信のClose処理
-
pthreadの使い方
-
ユーザーインターフェイスの一...
-
Linuxでスレッド優先度って変え...
-
win32 スレッドのハンドルついて
おすすめ情報