我做的上位机程序,不断的在采集下位机发送过来的数据,并在picturebox上描点画图谱。采集到的数据,我放在两个数组里
Dim Datacomy_pic1(100000) As Single      '采集数据Y
Dim Timex_pic1(100000) As Single          '采集时间X当我的横轴时间超过设置的时间以后,就会不断地刷屏重新画,但是这个时间一长,数据点一多,就会出现死机的情况。
请大家帮我分析一下原因,说说怎么解决这个问题,多谢!

解决方案 »

  1.   

    数据采集绘图的办法很多,可以先在内存中绘制好了再使用BitBlt放置到PictrueBox中,参阅这个:
    http://download.csdn.net/source/2368159
      

  2.   


    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
    上面是我用到的两段只要程序,大家帮我看看,是哪里写的有问题,导致的死机?
      

  3.   


    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
    '下面添加你的绘图过程
      

  4.   

    楼主先看看你两个数组得占用多少内存吧,
    single类型一个数据占4字节,你申请了两个长度为一百万的数组,就用掉了800M的内存. 如此臃肿的程序,当然容易出现反映麻木的状况. 这还没包括你画的那个图片的内存和你程序其他方面的消耗,不过从这两个数组的使用来看,楼主的程序其他方面应该也是属于比较"大方"一类的,因此程序无响应应该是常态了.
    还是从这个方面下下功夫精简一下吧.
    要知道俺们在DOS下写程序的时候系统一共才640K内存.呵呵