![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_08.png?8acaa2e)
お世話になります。
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ランキング
-
VC++スレッドの正しい終了のさ...
-
pthread_mutex_lock の応答時間
-
メインスレッドのPostMessageと...
-
スレッドの安全な終了のさせ方
-
Win32APIでのスレッド処理
-
スレッドの監視方法について
-
WaitForSingleObjectの使い方に...
-
スレッドの終了の仕方
-
スレッドがサスペンドされてい...
-
C# スレッド終了の監視について
-
別スレッドからメインダイアロ...
-
スレッド終了を待つ間に開放さ...
-
DirectX キーが入力されるまで...
-
C言語で一定時間待機後、再実行
-
Windows上で、シグナル(SIGTERM...
-
頭冷やし終えました。スクリー...
-
pthread_cond_wait 取りこぼし?
-
同一スレッドで、ロックをかけ...
-
スレッド一覧の取得
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
Windows上で、シグナル(SIGTERM...
-
マルチスレッドプログラミング...
-
スレッドの終了の仕方
-
スレッドにて同一メモリの書き...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
スレッドでWM_TIMERを受け取れない
-
同一スレッドで、ロックをかけ...
-
マルチスレッドのスレッド数を...
-
WaitForMultipleObjectのイベン...
-
MFC通信プログラムマルチスレッ...
-
CWnd::OnTimerのスレッドの取得
-
待機関数(WaitForMultipleObjec...
-
LinuxでDoEvents()同等機能
-
【VC++6.0(MFC)】スレッドの呼...
-
pthread_cond_wait 取りこぼし?
おすすめ情報