- PR -

Windowsアプリ 画面表示について

投稿者投稿内容
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 2004-07-12 13:20
[WinXP Pro(SP1)、.NET2003 C#]

いつもお世話になっております。

Windowsアプリケーションでの画面表示について
教えていただきたいことがあります。

Form1、Form2があるプロジェクトを作成し、
Form2にはボタンを1つ貼り付けます。

From1のボタンを押下するとForm2の画面が起動するよう
コーディングし、実際に試すと正常にFormが表示される
のですが、外部からのイベント(ここではMSMQでの
メッセージを受信したタイミング)で同じように
Form2をShowするとForm2側が固まってしまいます。

何が原因なのかが分かりません。

どなたか解決策、ヒント等お持ちでしたら
ご教授頂けないでしょうか。

宜しくお願い致します
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-07-12 17:51
いろんなところにブレークポイントを貼って確認してみたらどうでしょうか?
Form2 を起動するところとか Form2 のコンストラクタとか Form2 の拾っているイベントとか・・・
Form1 も同様です。
持っている情報をもう少し提示しないと答えづらいのではないかと思います。
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 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");
}
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-12 20:25
引用:

花さんの書き込み (2004-07-12 18:43) より:
// MSMQでメッセージを受信した場合
private void MessageRecive()
{
// Form2の表示で固まる。
 // Form2側のメッセージボックスは表示されるが、
 // 画面自体は固まっている。
Form2 frm = new Form2();
frm.Show();
// これを入れないと画面自体の描画もされない
frm.Refresh();
}


このイベントはフォームのスレッドとは別物として届きますか?
試したわけじゃないですが、もし別ならこのメソッドを
Form.Invoke等を使用して実行してみたらどうなります?
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 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();
}
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-14 16:52
引用:

花さんの書き込み (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();
}


Form2 frm = new Form2();
もInvoke経由の中に入れてみてください(でないと意味がないような気がします)。
イメージ的にはMessageReciveメソッドをInvokeで呼び出す感じかな?

※これが原因かは分からないですが、とりあえず気になる部分です。
会議室デビュー日: 2004/04/29
投稿数: 14
投稿日時: 2004-07-14 22:08
>なちゃさん

ご教授ありがとうございます。

>Form2 frm = new Form2();
>もInvoke経由の中に入れてみてください(でないと意味がないような気がします)。

上記の説明部分が理解できず(Invoke経由)色々自分なりに調べて見たのですが
進展がありません。。
"Invoke経由の中に入れる"についてもう少し詳細に教えていただけないでしょうか?


宜しくお願い致します。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-14 23:12
引用:

花さんの書き込み (2004-07-14 22:08) より:
>Form2 frm = new Form2();
>もInvoke経由の中に入れてみてください(でないと意味がないような気がします)。

上記の説明部分が理解できず(Invoke経由)色々自分なりに調べて見たのですが
進展がありません。。
"Invoke経由の中に入れる"についてもう少し詳細に教えていただけないでしょうか?


あ、ごめんなさい、前のプログラムよく読めてませんでした。
Invokeは、現在のフォームのInvokeを呼んでください。
※つまり、Form1のコード内で、Me.Invokeのような感じで

MessageReciveメソッドを、
コード:
private void MessageRecive() 
{ 
  // Form2の表示で固まる。 
  // Form2側のメッセージボックスは表示されるが、 
  // 画面自体は固まっている。 
  Form2 frm = new Form2(); 
  frm.Show(); 
}


のような状態として、どこかでMessageReciveを呼んでいるはなので、
そこを
this.Invoke(new MethodInvoker(this.MessageRecive))
みたいな感じにします。

っていうか、MessageReciveを呼び出してるところに届いているはずの、MSMQの受信イベントは、フォームのスレッドとは別のスレッドで(フォームとは非同期に)呼ばれていますか?
そもそもそうなっていないのなら、私が書いたことは意味ないので…

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