- - PR -
Windowsアプリ 画面表示について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-07-12 13:20
[WinXP Pro(SP1)、.NET2003 C#]
いつもお世話になっております。 Windowsアプリケーションでの画面表示について 教えていただきたいことがあります。 Form1、Form2があるプロジェクトを作成し、 Form2にはボタンを1つ貼り付けます。 From1のボタンを押下するとForm2の画面が起動するよう コーディングし、実際に試すと正常にFormが表示される のですが、外部からのイベント(ここではMSMQでの メッセージを受信したタイミング)で同じように Form2をShowするとForm2側が固まってしまいます。 何が原因なのかが分かりません。 どなたか解決策、ヒント等お持ちでしたら ご教授頂けないでしょうか。 宜しくお願い致します | ||||||||
|
投稿日時: 2004-07-12 17:51
いろんなところにブレークポイントを貼って確認してみたらどうでしょうか?
Form2 を起動するところとか Form2 のコンストラクタとか Form2 の拾っているイベントとか・・・ Form1 も同様です。 持っている情報をもう少し提示しないと答えづらいのではないかと思います。 | ||||||||
|
投稿日時: 2004-07-12 18:43
>えムナウさん
お返事ありがとうございます。 Form2で拾っているイベントはLoadのみで、 コンストラクタとLoadでデバッグとして MessageBoxを表示させていますが、 両方ともメッセージボックスは表示 されます。 [Form1] // ボタンクリックイベント private void Button_Click(object sender, System.EventArgs e) { // こっちはちゃんとForm2が表示される Form2 frm = new Form2(); frm.Show(); } // MSMQでメッセージを受信した場合 private void MessageRecive() { // Form2の表示で固まる。 // Form2側のメッセージボックスは表示されるが、 // 画面自体は固まっている。 Form2 frm = new Form2(); frm.Show(); // これを入れないと画面自体の描画もされない frm.Refresh(); } [Form2] public Form2() { MessageBox.Show("Form2"); } private void Fomr2_Load(object sender, System.EventArgs e) { MessageBox.Show("Form2 Load"); } | ||||||||
|
投稿日時: 2004-07-12 20:25
このイベントはフォームのスレッドとは別物として届きますか? 試したわけじゃないですが、もし別ならこのメソッドを Form.Invoke等を使用して実行してみたらどうなります? | ||||||||
|
投稿日時: 2004-07-14 12:13
>なちゃさん
お返事ありがとうございます。 #遅くなり申し訳ありません。。 なちゃさんの方法で試してみましたところ 結果はNGでした。 下記コードではelse側に入り、 試しに条件式を外し、Invokeを使用 してみましたが、画面は表示されません。 private void MessageRecive() { Form2 frm = new Form2(); // else側に入る if( frm.InvokeRequired ) frm.Invoke( new MethodInvoker( frm.Show ) ); else frm.Show(); } | ||||||||
|
投稿日時: 2004-07-14 16:52
Form2 frm = new Form2(); もInvoke経由の中に入れてみてください(でないと意味がないような気がします)。 イメージ的にはMessageReciveメソッドをInvokeで呼び出す感じかな? ※これが原因かは分からないですが、とりあえず気になる部分です。 | ||||||||
|
投稿日時: 2004-07-14 22:08
>なちゃさん
ご教授ありがとうございます。 >Form2 frm = new Form2(); >もInvoke経由の中に入れてみてください(でないと意味がないような気がします)。 上記の説明部分が理解できず(Invoke経由)色々自分なりに調べて見たのですが 進展がありません。。 "Invoke経由の中に入れる"についてもう少し詳細に教えていただけないでしょうか? 宜しくお願い致します。 | ||||||||
|
投稿日時: 2004-07-14 23:12
あ、ごめんなさい、前のプログラムよく読めてませんでした。 Invokeは、現在のフォームのInvokeを呼んでください。 ※つまり、Form1のコード内で、Me.Invokeのような感じで MessageReciveメソッドを、
のような状態として、どこかでMessageReciveを呼んでいるはなので、 そこを this.Invoke(new MethodInvoker(this.MessageRecive)) みたいな感じにします。 っていうか、MessageReciveを呼び出してるところに届いているはずの、MSMQの受信イベントは、フォームのスレッドとは別のスレッドで(フォームとは非同期に)呼ばれていますか? そもそもそうなっていないのなら、私が書いたことは意味ないので… |