我做了一个实时告警采集的程序,用了5个winsock,在数据到达事件中语音提示内容.
程序运行过程中发现运行时间越长播放语音提示越慢,是什么原因呢?
另外,我在关闭程序的时候先关闭winsock连接,窗体unload了好像程序正常退出了.但是在windows进程管理里面发现程序还在!时间一长往往有好几个在里面?这是什么原因?怎样解决?
多谢!

解决方案 »

  1.   

    晕这跟WINSOCK没关系的你的代码有问题
      

  2.   

    怎么输要5个WINSOCK?是不是太多了些?
      

  3.   

    远程连接是有这种问题,我做FTP也是,但你的Winsock也太多了
      

  4.   

    用5个winsock是因为必须要的,一个地方来的数据用一个,5个地方,这样不行吗?另外,我的代码怎么会有问题呢,在点击按钮退出时,关闭winsock连接,unload窗体,有什么不对吗?
    请多多指教!
      

  5.   

    谢谢你们的解答,这么晚了你们居然还在!
    我考虑到可以用winsock的控件组,但是不很熟悉,因为我要长时间和远程机器连并从那里取告警,所以我就用了5个,一人一个,我是知道WINSOCK多了耗费资源,但是有什么好办法吗?
    如果非正常退出连接会变成TIME_WAIT状态,不知道是不是这个原因造成的程序不能正常退出.
      

  6.   

    数据接收量每次很小,我想是不是问题还是出在WINSOCK身上,不过有时候运行一段时间WINDOWS会提示虚拟内存不够.但有时候没有啊,WINSOCK接收数据是放在什么地方,我能用WINSOCK控件组吗
    研究不透
      

  7.   

    啊?接收量小还会这样?那你的代码绝对有问题了!
    我自己做的文件互传工具.
    每秒接收45K/S还很正常啊!
    能把你的WINSOCK数据接收事件中写的代码贴出来吗?如果优化了化码后区区5个WINSOCK是没什么关系的.
      

  8.   

    呵呵,不好意思,贴出来会吓着你,很长很长,用了很多IF THEN ,因为我要分析告警内容播放声音
    问题出在这里吗
      

  9.   

    嗯~可能会在建议自定义一个数据格式.全部使用BYTE数组然后在数组的第一个字节或最后一个字节处设置一下标记那么你的机器接到这个数据后只要判断第一个字节是什么就能知道这条消息应该怎么处理了.
      

  10.   

    强烈建议传递的数据全部采用BYTE数组方式传输!
    代码多写两行没事不过怎么说呢你要有能把任何数组转成BYTE数组存放才行.嘿嘿我的程序以前就这样的.不论是应用程序的事件信息还是对方的字串聊天信息以及还有文件数据等
    全部用一个WINSOCK发送而不会混淆.
      

  11.   

    谢谢你! FUNDGIRL(阿弥陀佛(回答问题为何不给我分?)) ,可是我觉得我用字符型来处理我收到的信息,应该没有问题,优化倒是应该做,我的同事们觉得我很厉害,呵呵,他们还不知道我的程序有多笨呢
      

  12.   

    Private Sub winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim strdata As String
    Dim tim, tim1, stt1 As String
    Dim plays, row As Long
    Dim aa, bb, cc, a, b, c, d, e, f, g, h, i, j, k, l, m, n, dd, o, len3, len4 As Integer
    Dim len1, len2, KeyAscii As Integer
    If fg.row <= 48 Then'FG为MSFLEXGRID控件,显示告警内容
    Open "c:\Program Files\告警监控\log.txt" For Append As #3
        Winsock1.GetData strdata
       aa = InStr(strdata, "<")
        bb = Len(strdata)
        cc = InStr(strdata, "ALARM STATUS")
        dd = InStr(strdata, "ALARM LIST")
        a = InStr(strdata, "CP FAULT")
        b = InStr(strdata, "CEASING")
        c = InStr(strdata, "RP FAULT")
        d = InStr(strdata, "SP NODE")
        e = InStr(strdata, "CCITT7 SIGNALLING LINK FAILURE")
        f = InStr(strdata, "DIGITAL PATH FAULT SUPERVISION")
        g = InStr(strdata, "GROUP SWITCH FAULT")
        h = InStr(strdata, "A1")
        i = InStr(strdata, "A2")
        j = InStr(strdata, "A3")
        k = InStr(strdata, "MAGAZINE POWER FAULT")
        l = InStr(strdata, "SYSTEM RESTART")
        m = InStr(strdata, "COMMON CHARGING OUTPUT CONGESTION")
         n = InStr(strdata, "SOFTWARE ERROR")
        o = InStr(strdata, "RADIO TRANSMISSION GB INTERFACE FAULT")
        ' Open "c:\Program Files\告警监控\log.txt" For Append As #3
         If Right(strdata, 3) = "DE:" Or Right(strdata, 3) = "RD:" Or Right(strdata, 1) = "<" Or InStr(strdata, "???") <> 0 Or InStr(strdata, "AUTHORIZATION FAILURE") <> 0 Then 
    If Right(strdata, 3) = "DE:" Then '输入PASSWORD
         Winsock1.SendData 系统配置.Text2.Text & vbCrLf'输入用户名
         
          Else
         If Right(strdata, 3) = "RD:" Then
          Winsock1.SendData 系统配置.Text84.Text & vbCrLf
          Else
          End If
          If Right(strdata, 1) = "<" And ss = 1 And pp = 0 Then
    RichTextBox1.Text = RichTextBox1.Text & "您已经连接到..." & 系统配置.Text27.Text & " , 实时告警采集已启动..." & vbCrLf
          Winsock1.SendData StrConv(Chr(4), 8)
          Else
          End If
          If InStr(strdata, "AUTHORIZATION FAILURE") <> 0 Then
         MsgBox ("用户名或者密码不对,请重新设置!")
         Else
         End If
    End If
        Else
            If InStr(strdata, "END") <> 0 And InStr(strdata, "LOGGED OFF") = 0 And cc = 0 And bb <> 77 And bb <> 616 And dd = 0 And InStr(strdata, "???") = 0 And InStr(strdata, "") = 0 And InStr(strdata, "AUTHORIZATION FAILURE") = 0 Then
        Print #3, strdata
        RichTextBox1.SelStart = Len(RichTextBox1.Text) + 29
        RichTextBox1.Text = RichTextBox1.Text & strdata & vbCrLf
       If InStr(strdata, "PAGE    1") <> 0 Then
       len3 = Len(strdata)
       len4 = InStr(strdata, "PAGE    1")
    tim = left((Right(left(strdata, len4 - 1), 13)), 11)
       Else
       End If
       fg.TextMatrix(fg.row, 3) = strdata
      fg.TextMatrix(fg.row, 2) = tim
         '********根据不同告警发送声音文件***************
    If InStr(strdata, 系统配置.Text27.Text) <> 0 Then
          fg.TextMatrix(fg.row, 0) = 系统配置.Text27.Text
          Else
         End If
    If InStr(strdata, "SIZE CHANGE REQUIRED") <> 0 And bb = 0 Then
              plays = sndPlaySound("c:\Program Files\告警监控\JUAsize.wav", SND_LOOP Or SND_ASYNC) '播放声音文件
       fg.Col = 3
    fg.RowSel = fg.row
    fg.CellBackColor = RGB(255, 0, 0)
        End If
       
    太长删除一部分告警内容分析
          fg.row = fg.row + 1
     Else
     End If
     End If
      Close #3
      Else
      fg.row = 1
      Loop
    fg.row = 0
    fg.Clear
    End If
        Close #3     End Sub对不起,只好让你们晕了
      

  13.   

    首先建议:干嘛每次一收到都定义这么多变量啊?会死人的!
    为什么不做全局变量?!!
    定义一个变量比访问一个变量来的慢多了!占用资源也多!后面的就不用看了效率极为低下!
    为什么不转成BYTE数组发送呢?