VB winsock 接收数据会变慢

bigassangel2010 2017-04-25 08:58:04
请问大家帮忙看看我的代码?为什么接收数据会越来越慢,我是先发送一条命令给我的服务器,然后服务器会返回一些告警信息,大概有几万行的信息。
接收代码如下:
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)

Static strData, strSend As Byte

Winsock.GetData strData, vbString

RichTextBox1.Text = RichTextBox1.Text & strData

RichTextBox1.SelStart = Len(RichTextBox1.Text)

End Sub
...全文
1109 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-04-27
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
bigassangel2010 2017-04-26
  • 打赏
  • 举报
回复
感谢大家的帮助,我找到一个方法,试了可行。分享给大家。

Private Const WM_USER = &H400
Private Const EM_EXSETSEL = (WM_USER + 55)
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const WM_VSCROLL = &H115
Const SB_BOTTOM = 7
Const WM_KEYDOWN = &H100
Const VK_LEFT As Long = &H25

Dim txtlen As Long

Private Sub txtwrite(str As String)

    SendMessage RichTextBox1.hwnd, EM_EXSETSEL, 0, txtlen
    RichTextBox1.SelText = str & vbNewLine
    txtlen = txtlen + LenB(str) + 2
    SendMessage RichTextBox1.hwnd, EM_EXSETSEL, 0, txtlen
    PostMessage RichTextBox1.hwnd, WM_KEYDOWN, VK_LEFT, 0
    PostMessage RichTextBox1.hwnd, WM_VSCROLL, SB_BOTTOM, 0
    
End Sub

Private Sub WinsockAHP_DataArrival(ByVal bytesTotal As Long)
    
    Static strData, strSend As Byte
    
    WinsockAHP.GetData strData, vbString
    txtwrite (strData)
    
End Sub

参考自http://blog.sina.com.cn/s/blog_6379dd3b0100u32n.html 现在我有另外一个问题:我接收到的数据字符有的应该在一行的却变成了两行,有办法解决吗?
bigassangel2010 2017-04-25
  • 打赏
  • 举报
回复
非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?
赵4老师 2017-04-25
  • 打赏
  • 举报
回复
Winsock.GetData strData, vbArray + vbByte
赵4老师 2017-04-25
  • 打赏
  • 举报
回复
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData() As Byte
Dim f As Integer
 ReDim strData(bytesTotal-1)
 Winsock.GetData strData, vbByte
 f=FreeFile()
 open "data" for append as #f
 print #f,StrConv(strData,vbUnicode)
 close #f
' RichTextBox1.Text = RichTextBox1.Text & StrConv(strData,vbUnicode)
' RichTextBox1.SelStart = Len(RichTextBox1.Text)

End Sub

zdingyun 2017-04-25
  • 打赏
  • 举报
回复
引用 9 楼 zdingyun 的回复:
[quote=引用 3 楼 bigassangel2010 的回复:] 非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?
无论使用哪个控件,建议接收内容放置于变量,完成接收后再赋值给控件的文本属性显示,不然界面控件显示的更新累加会远远拉缓程序运行速度。[/quote] 显示最新接收数据,后台处理将每次接收数据写入文件,需查阅时显示与显示控件。
zdingyun 2017-04-25
  • 打赏
  • 举报
回复
引用 3 楼 bigassangel2010 的回复:
非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?
无论使用哪个控件,建议接收内容放置于变量,完成接收后再赋值给控件的文本属性显示,不然界面控件显示的更新累加会远远拉缓程序运行速度。
tanta 2017-04-25
  • 打赏
  • 举报
回复
肯定会越来越慢啊,你需要看到所有的接收的数据吗?不需要的话,截断吧,只显示最新的n条就可以了。
舉杯邀明月 2017-04-25
  • 打赏
  • 举报
回复
我觉得,“越来越慢”的关键原因,还是在于这一句: RichTextBox1.Text = RichTextBox1.Text & strData 当“文本”内容很多时,后面的那个“字符串运算”耗时会增加(次要因素),对“对象赋值”也会消耗大量时间。 而楼主的操作会“频繁刷新内容”,必然会显得越来越慢了。 也许用qinguangjun123在4楼说的方法,能有所改善。
三楼の郎 2017-04-25
  • 打赏
  • 举报
回复
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
dim strData() as byte
ReDim strData(bytesTotal-1)
Winsock.GetData strData, vbbyte
RichTextBox1.Text = RichTextBox1.Text & strconv(strData,vbUnicode)
RichTextBox1.SelStart = Len(RichTextBox1.Text)
erase strData
End Sub 
试下啦,慢估计是应为你用static声明的静态变量啦
qinguangjun123 2017-04-25
  • 打赏
  • 举报
回复
RichTextBox1的刷新很耗时间
qinguangjun123 2017-04-25
  • 打赏
  • 举报
回复
别用RichTextBox1,用listview控件

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧