VB winsock 接收数据会变慢

时间:2022-10-09 23:43:38
请问大家帮忙看看我的代码?为什么接收数据会越来越慢,我是先发送一条命令给我的服务器,然后服务器会返回一些告警信息,大概有几万行的信息。
接收代码如下:
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
 

12 个解决方案

#1


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

#2


Winsock.GetData strData, vbArray + vbByte

#3


非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?

#4


别用RichTextBox1,用listview控件

#5


RichTextBox1的刷新很耗时间

#6


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声明的静态变量啦

#7


我觉得,“越来越慢”的关键原因,还是在于这一句:
RichTextBox1.Text = RichTextBox1.Text & strData

当“文本”内容很多时,后面的那个“字符串运算”耗时会增加(次要因素),对“对象赋值”也会消耗大量时间。
而楼主的操作会“频繁刷新内容”,必然会显得越来越慢了。

也许用qinguangjun123在4楼说的方法,能有所改善。

#8


肯定会越来越慢啊,你需要看到所有的接收的数据吗?不需要的话,截断吧,只显示最新的n条就可以了。

#9


引用 3 楼 bigassangel2010 的回复:
非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?

无论使用哪个控件,建议接收内容放置于变量,完成接收后再赋值给控件的文本属性显示,不然界面控件显示的更新累加会远远拉缓程序运行速度。

#10


引用 9 楼 zdingyun 的回复:
Quote: 引用 3 楼 bigassangel2010 的回复:

非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?

无论使用哪个控件,建议接收内容放置于变量,完成接收后再赋值给控件的文本属性显示,不然界面控件显示的更新累加会远远拉缓程序运行速度。

显示最新接收数据,后台处理将每次接收数据写入文件,需查阅时显示与显示控件。

#11


感谢大家的帮助,我找到一个方法,试了可行。分享给大家。

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

现在我有另外一个问题:我接收到的数据字符有的应该在一行的却变成了两行,有办法解决吗?

#12


不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545

#1


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

#2


Winsock.GetData strData, vbArray + vbByte

#3


非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?

#4


别用RichTextBox1,用listview控件

#5


RichTextBox1的刷新很耗时间

#6


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声明的静态变量啦

#7


我觉得,“越来越慢”的关键原因,还是在于这一句:
RichTextBox1.Text = RichTextBox1.Text & strData

当“文本”内容很多时,后面的那个“字符串运算”耗时会增加(次要因素),对“对象赋值”也会消耗大量时间。
而楼主的操作会“频繁刷新内容”,必然会显得越来越慢了。

也许用qinguangjun123在4楼说的方法,能有所改善。

#8


肯定会越来越慢啊,你需要看到所有的接收的数据吗?不需要的话,截断吧,只显示最新的n条就可以了。

#9


引用 3 楼 bigassangel2010 的回复:
非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?

无论使用哪个控件,建议接收内容放置于变量,完成接收后再赋值给控件的文本属性显示,不然界面控件显示的更新累加会远远拉缓程序运行速度。

#10


引用 9 楼 zdingyun 的回复:
Quote: 引用 3 楼 bigassangel2010 的回复:

非常感谢,但是我发现如果用我的方法,直接写进txt文件也是可以的,有没有办法可以显示出接收的文件,但是不影响速度?

无论使用哪个控件,建议接收内容放置于变量,完成接收后再赋值给控件的文本属性显示,不然界面控件显示的更新累加会远远拉缓程序运行速度。

显示最新接收数据,后台处理将每次接收数据写入文件,需查阅时显示与显示控件。

#11


感谢大家的帮助,我找到一个方法,试了可行。分享给大家。

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

现在我有另外一个问题:我接收到的数据字符有的应该在一行的却变成了两行,有办法解决吗?

#12


不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545