[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/03/07(Wed) 15:23
投稿者名:戸豚
Eメール:
URL :
タイトル:
Winsockコントロールを使っていて固まる
Windows XP/Pro、VB 6.0 SP5でWinsockコントロールを使ったTCP通信するツールを作っています。
Winsockコントロールで独自プロトコル(というほどたいそうなものではないのですが)でマイコンボードとPCの間の通信を行ってます。

マイコンボードから60バイト〜70バイト程度のデータを送信すると、PC側で頭のほうの14〜16バイトを受信したところでフリーズします。
タスクマネージャーを見るとCPU使用率が100%になってます。
そのプロセスを強制終了するまでCPU使用率は100%で、画面の更新も行われません。
受信するコードは次のとおりで、変なことはしてないつもりです。

Private Sub winsckPort1_DataArrival(ByVal bytesTotal As Long)
    ' 受信イベント.
    Static recvData() As Byte
    winsckPort1.GetData recvData, vbArray + vbByte, bytesTotal
    Call addTcpRecivieData(recvData)
End Sub

addTcpRecivieDataプロシージャの中ではバイト配列を "00 01 02"のような16進数表現でString型にいれて、ログファイルに書いてます。
同じPCで出たり出なかったり、ほかのPCでも出たりでなかったりと動作が不安定で困ってます。

固まらないようにするには、どんな点に注意すれば良いでしょうか?

投稿時間:2007/03/09(Fri) 10:19
投稿者名:y4yama
Eメール:
URL :
タイトル:
Re: Winsockコントロールを使っていて固まる
2003でWinsockをしたことはあるというだけで、外しているかもですが、
> Private Sub winsckPort1_DataArrival(ByVal bytesTotal As Long)
>     ' 受信イベント.
>     Static recvData() As Byte
>     winsckPort1.GetData recvData, vbArray + vbByte, bytesTotal
>     Call addTcpRecivieData(recvData)
> End Sub

1.CALL前にbytesTotalの値はいくらにしてますか?
2.VB6のヘルプをみると、recvData As String
winsckPort1.GetData recvData で、あとの引数はなしで、受信データは
キューから取り出せるはずですよね。これでaddTcpRecivieData()は無しでテストしてみて、まずフリーズする
ことなしに動作が続くかを確認してみたらどうでしょう

投稿時間:2007/03/10(Sat) 14:25
投稿者名:戸豚
Eメール:
URL :
タイトル:
Re^2: Winsockコントロールを使っていて固まる
前回に続いて、ありがとうございます。

> 1.CALL前にbytesTotalの値はいくらにしてますか?

winsckPort1_DataArrivalはVB6.0のWinSockコントロールのイベントなので、bytesTotalは受信したバイト数が入ってきています。

> 2.VB6のヘルプをみると、recvData As String
> winsckPort1.GetData recvData で、あとの引数はなしで、受信データは
> キューから取り出せるはずですよね。これでaddTcpRecivieData()は無しでテストしてみて、まずフリーズする
> ことなしに動作が続くかを確認してみたらどうでしょう

最初はStringでやってましたけどバイナリデータの扱いが面倒なのと、通信するデータのほとんどがバイナリデータなのでByte配列にした経緯があります。
試行錯誤した結果なのでいまいち自信がないですが、GetDataの使い方は正しいはずです。

addTcpRecivieData()なしではフリーズしませんでした。
ファイルに書いたりしてるのが怪しいのかと思って、試行錯誤してDataArrivalイベントで長い処理をかけると固まるのがわかったんですが、そこから先がお手上げに近いです。
たぶんDataArrivalイベントを落とすケースがあるんだと思いますが確認できてないです。

根本的な回避策ではないですけど、Do 〜 LoopでDoEvents実行しながらBytesReceivedメソッド使って受信監視するような方法を試してます。
まだ固まる症状はでてないのでこの方法で行こうかと思ってます。