
プログラミングに関してなにかヒントがあればご教授いただきたく投稿しました。
VB.net2008 Framework2.0向けで作成中のアプリです。
上記アプリはフォームの中で無線の受信を口を開けて待っています。
→LOOPの中のある関数で受信するまで待機しています。
そこに VB6の他アプリから「SendMessage HWND_BROADCAST・・・・」をやられると
両方のアプリがハングアップ(フリーズ?)してしまいます。
BROADCASTは全てのウィンドウにメッセージを送ることはわかったのですが
これを回避する方法が見つかりません。
何卒ご教授の程よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
ん? 質問変えた? さっき似たような質問があって、その時に回答しようとしたら質問が消されたので書き込めなかったが、SendMessageで送ったメッセージはAcceptTcpClient()では受け取れないですよ。
なぜWin32 API(on VB6)でブロードキャストしたメッセージをTCPで受け取ろうと思ったんだ? その辺を説明しないと回答は得られんぞなもし。
無線の受信というのもよく意味が分からない。
正直QAサイトで扱える範疇ではないと思うので、いくつか要点を絞ってアドバイス。
送った側のVB6も固まるというのが気になるところではあるが・・・・。
・AcceptTcpClient()をするのはフォームとは別スレッドにしないといけない。さらに得られたTcpClientとやりとりをするのはそれとも別スレッドにすべき。
・SendMessageで発信されたメッセージを.Net側で受け取るのは「WndProc」で情報を集めてくれ。こちらは別スレッドを作る必要はない。
anmochi様
質問変えました。大変申し訳ない次第です。
スレッドあたりの構築をやり直します。
大変わかりやすいご説明を頂きましてありがとうございます。
No.2
- 回答日時:
No1のお礼に対して
事前に断わっておきますが私は基本的にVB触ったこと殆どありませんので
具体的なコードなどの提示はしません
ソース見ると作ってるのはサーバプログラムで
クライアントからの接続待ちでループしてるってことだと思いますが
それをどこかのイベントでコールしてるでしょ
根本的な作りが悪い
ブロッキングモードで作ってるようですが
・ノンブロッキングモードに変更する
・スレッド化してスレッドで実行する
どちらかの対処をしてください
それで治ると思います
No.1
- 回答日時:
具体的なコードがないので何とも言えないところもありますが
> →LOOPの中のある関数で受信するまで待機
ここで他のメッセージループが止まっていて処理できなくてハングする
といったことではないかという気がします
試にそのループ処理とやらを動かない状態で動作させたらどうなりますか
>VB6の他アプリ
これはあなたが作った別のアプリってことですか?
この回答への補足
koi1234様
回答ありがとうございます。
>> →LOOPの中のある関数で受信するまで待機
>ここで他のメッセージループが止まっていて処理できなく>てハングする
>といったことではないかという気がします
>試にそのループ処理とやらを動かない状態で動作させたら>どうなりますか
その通りで、Loopの中で待機しているので
LOOPを回避すればハングアップはしません
While True
Dim myTcpClient As New Sockets.TcpClient
myTcpClient=myListener.AcceptTcpClient()←ここで待機
Loop
>VB6の他アプリ
これはあなたが作った別のアプリってことですか?
→いえ 他人のアプリでソースは公開されていますが、改修はできないので.net側でどうにかするしかないのです。
何か分りますか? どうか引き続きよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFC通信プログラムマルチスレッ...
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
WaitForSingleObjectの使い方に...
-
C# スレッドから親ウィンドウへ...
-
.NetのBackgroundWorkerクラス...
-
メインダイアログが最背面に表...
-
特定のスレッドの破棄
-
マルチスレッドの実行順序の制御
-
volatile の使い方
-
メインスレッドのPostMessageと...
-
スレッドの終了の仕方
-
C言語である関数への同時アクセ...
-
Macターミナルで実行中のプログ...
-
VBSの処理中一旦処理を止めて再...
-
バックグラウンドのプロセスの...
-
VB6からVB2010への変換について
-
C# シリアル通信でデータ受信...
-
ソケットのrecvの戻り値が0
-
VB 6 を VS 2012に変換するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
複数スレッドを動作させるのに...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
同一スレッドで、ロックをかけ...
-
マルチスレッド内のループについて
-
sleep関数とは?
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
CWnd::OnTimerのスレッドの取得
-
C言語である関数への同時アクセ...
-
別スレッドのデータを受信できない
-
VB2005 シリアル通信のClose処理
-
pthreadの使い方
-
ユーザーインターフェイスの一...
-
Linuxでスレッド優先度って変え...
-
win32 スレッドのハンドルついて
おすすめ情報