- - PR -
スレッドからフォームを表示
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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(); } } 何かいい方法ありませんでしょうか? よろしくお願いいたします。 | ||||||||
|
投稿日時: 2004-05-06 10:37
えっと、このコードがどんなことを実行しようとしてるか把握できていますか? 単純な話として、フォームはメッセージループが形成されていないと応答を受け付けることはできません。 # それ以前にすごいことしてますが… うーん、ちなみに別スレッドでフォームを表示しようとしているのはなぜですか? それも、モードレスに表示した言ってことなんですよね? | ||||||||
|
投稿日時: 2004-05-06 10:49
ご返答ありがとうございます。
なんとなく、すごいことしてるのはわかってきたのですが、それが なんとなくでしか理解できなかったもので。 なぜ、こういうことをしなくてはならないかといいますと、スレッド のなかで、ポーリング処理のようなものがありまして、その処理の 条件が合致した場合のみフォームを表示させたかったのです。 このスレッドとフォームの同期の取り方がいまいちわかりませんで、 投稿させていただきました。 | ||||||||
|
投稿日時: 2004-05-06 11:50
フォームを、モードレスで表示すると、メインフォームとは別のスレッド(なのかな?)で動作します。したがって、メインフォームと、ポーリングの結果によって表示を決定するフォーム(仮に「ポーリングフォーム」)は、何も考えずにプログラミングして良いと思います。 こうすると、ポーリングフォームは、 1.ポーリングを行う 2.結果によって表示する/しないを切り替える 必要がありますが、どちらもポーリングフォーム内で動作が完結します。 ポーリングを行う為には、一定時間ごとにコーディングしたコードに制御を持ってこなければなりませんが、これはタイマーコントロールで実現できます。 | ||||||||
|
投稿日時: 2004-05-06 12:03
NAL-6295です。 ここだけ、気になったので。 フォームを、モードレスで表示しても、別のスレッドにはなりません。 | ||||||||
|
投稿日時: 2004-05-06 12:09
やっぱり・・・なんていうんでしょう?別スレッドのように独立して扱える、そういうことがいいたかったので、そう読み替えてください>しでとさん | ||||||||
|
投稿日時: 2004-05-06 12:47
これもまた、微妙なトコロで、やはり同一スレッドである限り、同時に実行できるスレッドは一つなので、例えばメインフォームから実行されるForm2でタイマーを利用したポーリング処理を記述していたとしても、メインフォーム側でそのタイマー間隔より時間のかかる処理が実行されている間は、Form2側でそのタイマーのタイミングが来ても実行されないわけで、メインフォームで実行されている処理が終わった後に実行されるのです。 だから、そこのところは気を使う必要があります。 | ||||||||
|
投稿日時: 2004-05-06 13:13
みなさん、ご返答ありがとうございます。
Jittaさん なるほど、そういう手もありました。 忙しくなってくると、ぜんぜん頭がまわらず、、、ダメですね。 NAL-6295さん いろいろありがとうございます。 たしかに、Jittaさんの言われるような方法でもできるかもしれ ませんが、ちょっと悔しいので(笑)もう少し悪戦苦闘(勉強?) してみます。 よく考えると、もう少しちゃんと同期しないといけないことが あったので、BeginInvokeなどで同期してみようかなとも思って います。 みなさん、本当にありがとうございました。 |