• ベストアンサー

.netアプリへのSendMessageでフリーズ

プログラミングに関してなにかヒントがあればご教授いただきたく投稿しました。 VB.net2008 Framework2.0向けで作成中のアプリです。 上記アプリはフォームの中で無線の受信を口を開けて待っています。  →LOOPの中のある関数で受信するまで待機しています。 そこに VB6の他アプリから「SendMessage HWND_BROADCAST・・・・」をやられると 両方のアプリがハングアップ(フリーズ?)してしまいます。 BROADCASTは全てのウィンドウにメッセージを送ることはわかったのですが これを回避する方法が見つかりません。 何卒ご教授の程よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

ん? 質問変えた? さっき似たような質問があって、その時に回答しようとしたら質問が消されたので書き込めなかったが、SendMessageで送ったメッセージはAcceptTcpClient()では受け取れないですよ。 なぜWin32 API(on VB6)でブロードキャストしたメッセージをTCPで受け取ろうと思ったんだ? その辺を説明しないと回答は得られんぞなもし。 無線の受信というのもよく意味が分からない。 正直QAサイトで扱える範疇ではないと思うので、いくつか要点を絞ってアドバイス。 送った側のVB6も固まるというのが気になるところではあるが・・・・。 ・AcceptTcpClient()をするのはフォームとは別スレッドにしないといけない。さらに得られたTcpClientとやりとりをするのはそれとも別スレッドにすべき。 ・SendMessageで発信されたメッセージを.Net側で受け取るのは「WndProc」で情報を集めてくれ。こちらは別スレッドを作る必要はない。

ok-mode
質問者

お礼

anmochi様 質問変えました。大変申し訳ない次第です。 スレッドあたりの構築をやり直します。 大変わかりやすいご説明を頂きましてありがとうございます。

その他の回答 (2)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

No1のお礼に対して 事前に断わっておきますが私は基本的にVB触ったこと殆どありませんので 具体的なコードなどの提示はしません ソース見ると作ってるのはサーバプログラムで クライアントからの接続待ちでループしてるってことだと思いますが それをどこかのイベントでコールしてるでしょ 根本的な作りが悪い ブロッキングモードで作ってるようですが ・ノンブロッキングモードに変更する ・スレッド化してスレッドで実行する どちらかの対処をしてください それで治ると思います

ok-mode
質問者

お礼

koi1234様 仰る通りです。 根本を考え直します。勉強もし直します。 誠にありがとうございます。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

具体的なコードがないので何とも言えないところもありますが > →LOOPの中のある関数で受信するまで待機 ここで他のメッセージループが止まっていて処理できなくてハングする といったことではないかという気がします 試にそのループ処理とやらを動かない状態で動作させたらどうなりますか >VB6の他アプリ これはあなたが作った別のアプリってことですか?

ok-mode
質問者

補足

koi1234様 回答ありがとうございます。 >> →LOOPの中のある関数で受信するまで待機 >ここで他のメッセージループが止まっていて処理できなく>てハングする >といったことではないかという気がします >試にそのループ処理とやらを動かない状態で動作させたら>どうなりますか その通りで、Loopの中で待機しているので LOOPを回避すればハングアップはしません While True Dim myTcpClient As New Sockets.TcpClient myTcpClient=myListener.AcceptTcpClient()←ここで待機 Loop >VB6の他アプリ これはあなたが作った別のアプリってことですか? →いえ 他人のアプリでソースは公開されていますが、改修はできないので.net側でどうにかするしかないのです。 何か分りますか? どうか引き続きよろしくお願い致します。