お世話になります。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドにて同一メモリの書き...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
スレッドの終了の仕方
-
C#でスレッド実行中のイベント...
-
VC++スレッドの正しい終了のさ...
-
pthread_cond_wait での mutex
-
C# スレッド終了の監視について
-
.NetのBackgroundWorkerクラス...
-
スレッドの監視方法
-
pthread_cond_wait 取りこぼし?
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
VBAの配列サイズとメモリに関して
-
Mac 乗数の入力方法
-
C言語で、メモリを解放しないで...
-
MACで動く実行ファイルをWindow...
-
エクセル VBA でのCOMポート...
-
非表示になったエクセルは?
-
C# シリアル通信でデータ受信...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドの安全な終了のさせ方
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの終了はどうやるんで...
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
別スレッドのデータを受信できない
-
VB2005 シリアル通信のClose処理
-
複数スレッドを動作させるのに...
-
マルチスレッドプログラミング...
-
MFC通信プログラムマルチスレッ...
-
マルチスレッドの実行順序の制御
-
スレッドの終了の仕方
-
msec単位のWait Timerが作れない!
-
マルチスレッド内のループについて
-
C++でマルチスレッド処理をさせ...
-
待機関数(WaitForMultipleObjec...
-
メモリアクセスの競合について
-
同一スレッドで、ロックをかけ...
おすすめ情報