- PR -

スレッドからフォームを表示

投稿者投稿内容
しでと
会議室デビュー日: 2004/01/19
投稿数: 9
投稿日時: 2004-05-06 10:23
いつも拝見させていただいております。
どうしても意味がわからず、投稿させていただきました。
どなたか見識者の方からのアドバイスお願いいたします。

あるスレッドからフォームを表示させようと思いますが、スレッド
から直接Show()すると、応答なしのフォームが表示されます。

private Form2 frm2;
public Class1()
{
this.frm2 = new Form2();
this.thread = new Thread(new ThreadStart(this.testThread));
this.thread.Start();
}
private void testThread()
{
while(true)
{
Thread.Sleep(10000);
this.frm2.Show();
}
}

何かいい方法ありませんでしょうか?
よろしくお願いいたします。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-06 10:37
引用:

しでとさんの書き込み (2004-05-06 10:23) より:
どうしても意味がわからず、投稿させていただきました。

あるスレッドからフォームを表示させようと思いますが、スレッド
から直接Show()すると、応答なしのフォームが表示されます。
コード:
private void testThread()
{
	while(true)
	{
		Thread.Sleep(10000);
		this.frm2.Show();
	}
}




えっと、このコードがどんなことを実行しようとしてるか把握できていますか?

単純な話として、フォームはメッセージループが形成されていないと応答を受け付けることはできません。
# それ以前にすごいことしてますが…

うーん、ちなみに別スレッドでフォームを表示しようとしているのはなぜですか?
それも、モードレスに表示した言ってことなんですよね?
しでと
会議室デビュー日: 2004/01/19
投稿数: 9
投稿日時: 2004-05-06 10:49
ご返答ありがとうございます。
なんとなく、すごいことしてるのはわかってきたのですが、それが
なんとなくでしか理解できなかったもので。
なぜ、こういうことをしなくてはならないかといいますと、スレッド
のなかで、ポーリング処理のようなものがありまして、その処理の
条件が合致した場合のみフォームを表示させたかったのです。
このスレッドとフォームの同期の取り方がいまいちわかりませんで、
投稿させていただきました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-06 11:50
引用:

しでとさんの書き込み (2004-05-06 10:49) より:

なぜ、こういうことをしなくてはならないかといいますと、スレッド
のなかで、ポーリング処理のようなものがありまして、その処理の
条件が合致した場合のみフォームを表示させたかったのです。
このスレッドとフォームの同期の取り方がいまいちわかりませんで、
投稿させていただきました。


 フォームを、モードレスで表示すると、メインフォームとは別のスレッド(なのかな?)で動作します。したがって、メインフォームと、ポーリングの結果によって表示を決定するフォーム(仮に「ポーリングフォーム」)は、何も考えずにプログラミングして良いと思います。

 こうすると、ポーリングフォームは、
1.ポーリングを行う
2.結果によって表示する/しないを切り替える
必要がありますが、どちらもポーリングフォーム内で動作が完結します。

 ポーリングを行う為には、一定時間ごとにコーディングしたコードに制御を持ってこなければなりませんが、これはタイマーコントロールで実現できます。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-05-06 12:03
引用:

Jittaさんの書き込み (2004-05-06 11:50) より:
 フォームを、モードレスで表示すると、メインフォームとは別のスレッド(なのかな?)で動作します。したがって、メインフォームと、ポーリングの結果によって表示を決定するフォーム(仮に「ポーリングフォーム」)は、何も考えずにプログラミングして良いと思います。



NAL-6295です。

ここだけ、気になったので。
フォームを、モードレスで表示しても、別のスレッドにはなりません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-06 12:09
引用:

NAL-6295さんの書き込み (2004-05-06 12:03) より:

ここだけ、気になったので。
フォームを、モードレスで表示しても、別のスレッドにはなりません。



 やっぱり・・・なんていうんでしょう?別スレッドのように独立して扱える、そういうことがいいたかったので、そう読み替えてください>しでとさん
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-05-06 12:47
引用:

Jittaさんの書き込み (2004-05-06 12:09) より:
引用:

NAL-6295さんの書き込み (2004-05-06 12:03) より:

ここだけ、気になったので。
フォームを、モードレスで表示しても、別のスレッドにはなりません。



 やっぱり・・・なんていうんでしょう?別スレッドのように独立して扱える、そういうことがいいたかったので、そう読み替えてください>しでとさん



これもまた、微妙なトコロで、やはり同一スレッドである限り、同時に実行できるスレッドは一つなので、例えばメインフォームから実行されるForm2でタイマーを利用したポーリング処理を記述していたとしても、メインフォーム側でそのタイマー間隔より時間のかかる処理が実行されている間は、Form2側でそのタイマーのタイミングが来ても実行されないわけで、メインフォームで実行されている処理が終わった後に実行されるのです。
だから、そこのところは気を使う必要があります。
しでと
会議室デビュー日: 2004/01/19
投稿数: 9
投稿日時: 2004-05-06 13:13
みなさん、ご返答ありがとうございます。
Jittaさん
なるほど、そういう手もありました。
忙しくなってくると、ぜんぜん頭がまわらず、、、ダメですね。
NAL-6295さん
いろいろありがとうございます。

たしかに、Jittaさんの言われるような方法でもできるかもしれ
ませんが、ちょっと悔しいので(笑)もう少し悪戦苦闘(勉強?)
してみます。
よく考えると、もう少しちゃんと同期しないといけないことが
あったので、BeginInvokeなどで同期してみようかなとも思って
います。
みなさん、本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)