tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルメッセージボックス
記事No8730
投稿日: 2009/02/17(Tue) 15:30
投稿者DOON
DOONです。ご無沙汰しています。

WindowsXP ServicePack2 VisualStudio.NET 2005 VBで質問です。

formに非同期でソケットを作成しています。
上位とTCPIPで電文をやり取りする画面を作成しています。
Delegeteや、デザインパターンなどを考えて作成しました。

通常時は、ソケット切断をちゃんと認識しています。

ある任意の電文を上位から受けると
MessageBox.show("受信しました")と表示します。
このMessageboxを表示したままで、ソケットを切断すると、ソケット切断をプログラムが認識しません。

おかしいなと思ったので、
formにボタンを張り付けて button_clickでMessageBox.show("テスト")と書いて、
ボタンを押下して、
そのMessageBoxを表示したままで、ソケットを切断すると、認識します。

MessageBox.showを誰が呼ぶかによって、メッセージが捨てられている気がします。
前者はVisitorというクラス内でMessageBox.Showとしています。

メッセージループにかかわるのかなと思っています。

メッセージが捨てられない方法ってありますか?

教えていただければ幸いです。

[ツリー表示へ]
タイトルRe: メッセージボックス
記事No8731
投稿日: 2009/02/17(Tue) 18:09
投稿者YuO
> このMessageboxを表示したままで、ソケットを切断すると、ソケット切断をプログラムが認識しません。

認識しないというのは,何を意味していますか?
> ソケットを切断すると
と,能動的にソケットの接続を切断しているのですから,
プログラムはソケットの接続の切断を当然認識していますよね。

[ツリー表示へ]
タイトルRe^2: メッセージボックス
記事No8734
投稿日: 2009/02/17(Tue) 22:59
投稿者DOON
DOONです。説明が下手ですいません。
いつも下手です。

socketのbeginReceiveメソッドを使用しています。
つないだ先のソケットを能動的に切断すると
beginReceiveで読んだメソッドのcatch節に入ります。
通常時は、ここで、ソケットの切断を認識しています。

認識しないというのは、
このcatch節に入らないということです。

>プログラムはソケットの接続の切断を当然認識していますよね。
説明した場合の、メッセージボックスを表示していると
この切断によるcatch節に入らないです。
何もなかったようにふるまっています。

なので、メッセージボックス等、ボタン押下でないタイミングで
ダイアログを出した際に、そのダイアログのメッセージループで
メッセージを消去しいるように見えるのです。

以上、よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: メッセージボックス
記事No8739
投稿日: 2009/02/19(Thu) 10:27
投稿者DOON
DOONです。
苦戦しています、
うまいこといかないので、回避策を考えました。

@ソケット受信時にそのままMessageBox.showとはしないで、
tim.startとする。
そのタイマー内でMessageBox.showとする。
これだと、問題ないです。

Aソケット受信時にfrmを作成してfrm.showとする。
こうすると問題ないです。

beginreceiveで非同期受信して、そのあとinvokeしてます。
invokeRequired = falseのところで、MessageBox.showとしています。

messageboxが誰によって、呼ばれたかがわからないと
おかしくなるのでしょうか?

引き続き分かる方、よろしくお願いします。

[ツリー表示へ]
タイトルRe^4: メッセージボックス
記事No8740
投稿日: 2009/02/19(Thu) 13:57
投稿者DOON
DOONです。
自己レスです。

メッセージボックスは関係なかったです。
すいません。

最初のBeginReceiveから次のBeginReceiveを呼ぶまでの間に
MessageBox.showを行っていることになっていました。

次のBeginReceiveが動く前に、ソケットを切断しても、
検知しませんよね。
すいません。

BeginReceiveを勉強しなおします

[ツリー表示へ]