我做的上位机程序,不断的在采集下位机发送过来的数据,并在picturebox上描点画图谱。采集到的数据,我放在两个数组里
Dim Datacomy_pic1(100000) As Single '采集数据Y
Dim Timex_pic1(100000) As Single '采集时间X当我的横轴时间超过设置的时间以后,就会不断地刷屏重新画,但是这个时间一长,数据点一多,就会出现死机的情况。
请大家帮我分析一下原因,说说怎么解决这个问题,多谢!
Dim Datacomy_pic1(100000) As Single '采集数据Y
Dim Timex_pic1(100000) As Single '采集时间X当我的横轴时间超过设置的时间以后,就会不断地刷屏重新画,但是这个时间一长,数据点一多,就会出现死机的情况。
请大家帮我分析一下原因,说说怎么解决这个问题,多谢!
http://download.csdn.net/source/2368159
Private Sub MSComm1_OnComm()
Dim buffer As String
Dim zhuguanglu As String
Dim i As Integer
Dim Draw_num, numql As Integer
Dim Astr, Bstr As String
Dim Numq() As String
buffer = MSComm1.Input
Draw_num = Len(buffer)
If Draw_num > 20 Then
Astr = Mid(buffer, InStr(1, buffer, "S5"))
Bstr = Mid(Astr, 1, InStrRev(Astr, "800000") + 6)
Numq = Split(Bstr, "SM ")
numql = UBound(Numq)
For i = 1 To numql
zhuguanglu = Mid(Numq(i), 1, 6) Datacomy(timenumber) =HEX_to_DEC(zhuguanglu) '采集到的数据,Y
Timex(timenumber) = (timenumber - 1) / 1200 '时间X
Picture1.Line ((Timex(timenumber - 1)), Datacomy(timenumber - 1))-(Timex(timenumber), Datacomy(timenumber)), vbRed timenumber = timenumber + 1 '采集的总个数
Next i
'X轴移动
If Timex(timenumber - 1) > x2 Then 'x2为横轴的最大值,当超过时,自动加10分钟
x2 = x2 + 10
Draw_Coordinate_pic1 '清屏
Drawdata_txt Timex_pic1, Datacomy_pic1, vbred '重画
End If
End If
end subSub Drawdata_txt(TimeXX() As Single, DataYY() As Single, Col As Long) '刷屏后重新绘图
Dim i As Long
Picture1.DrawWidth = 1
For i = 1 To timenumber - 1
Picture1.Line ((TimeXX(i - 1)), DataYY(i - 1))-(TimeXX(i), DataYY(i)), Col
Next i
End SubEnd Sub
上面是我用到的两段只要程序,大家帮我看看,是哪里写的有问题,导致的死机?
Option Explicit
Dim strInput As String '接受数据的字符串
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Form_Load()
With MSComm1
.CommPort = 1 '依据你的实际情况设置
.Settings = "9600,n8,1" '依据你的实际情况设置
.InputLen = 1 '每次读取一个字符
.InputMode = comInputModeText '文本方式接受数据
.RThreshold = 1 '每接受一个字符触发一个OnComm事件
.PortOpen = True
End With
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MSComm1.PortOpen Then MSComm1.PortOpen = False
End Sub
'OnComm事件只负责数据接受,不进行绘图处理,具体的绘图处理放到Timer中去。这样可以减小数据采集时间开销,增强实时性
Private Sub MSComm1_OnComm()
Dim varP As Variant
Select Case MSComm1.CommEvent
Case 2
MSComm1.RThreshold = 0
Sleep 10
Do
varP = Null
varP = MSComm1.Input
strInput = strInput & Chr(varP(0))
Loop Until MSComm1.InBufferCount <= 0
MSComm1.RThreshold = 1
End Select
End Sub
'下面添加你的绘图过程
single类型一个数据占4字节,你申请了两个长度为一百万的数组,就用掉了800M的内存. 如此臃肿的程序,当然容易出现反映麻木的状况. 这还没包括你画的那个图片的内存和你程序其他方面的消耗,不过从这两个数组的使用来看,楼主的程序其他方面应该也是属于比较"大方"一类的,因此程序无响应应该是常态了.
还是从这个方面下下功夫精简一下吧.
要知道俺们在DOS下写程序的时候系统一共才640K内存.呵呵