一个苦恼的问题,请教高手

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

19 个解决方案

#1




这跟WINSOCK没关系的

你的代码有问题

#2


怎么输要5个WINSOCK?

是不是太多了些?

#3


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

#4


用5个winsock是因为必须要的,一个地方来的数据用一个,5个地方,这样不行吗?

另外,我的代码怎么会有问题呢,在点击按钮退出时,关闭winsock连接,unload窗体,有什么不对吗?
请多多指教!

#5


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

#6


对了.

数据接收量有多大啊?

看看是不是机器配置的原因

#7


数据接收量每次很小,我想是不是问题还是出在WINSOCK身上,

不过有时候运行一段时间WINDOWS会提示虚拟内存不够.但有时候没有啊,

WINSOCK接收数据是放在什么地方,我能用WINSOCK控件组吗


研究不透

#8


啊?

接收量小还会这样?

那你的代码绝对有问题了!


我自己做的文件互传工具.
每秒接收45K/S还很正常啊!


能把你的WINSOCK数据接收事件中写的代码贴出来吗?

如果优化了化码后区区5个WINSOCK是没什么关系的.

#9


估计你的数据接收处理有问题!

#10


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


问题出在这里吗

#11


嗯~

可能会在

建议自定义一个数据格式.

全部使用BYTE数组

然后在数组的第一个字节或最后一个字节处设置一下标记

那么你的机器接到这个数据后只要判断第一个字节是什么就能知道这条消息应该怎么处理了.

#12


强烈建议传递的数据全部采用BYTE数组方式传输!


代码多写两行没事

不过怎么说呢

你要有能把任何数组转成BYTE数组存放才行.

嘿嘿

我的程序以前就这样的.

不论是应用程序的事件信息还是对方的字串聊天信息以及还有文件数据等
全部用一个WINSOCK发送而不会混淆.

#13


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

#14


强烈建议贴出代码,一家人给你解决问题,你让大家发挥想象力猜吗?

#15


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



对不起,只好让你们晕了

#16


首先建议:

干嘛每次一收到都定义这么多变量啊?

会死人的!
为什么不做全局变量?!!
定义一个变量比访问一个变量来的慢多了!占用资源也多!

后面的就不用看了

效率极为低下!
为什么不转成BYTE数组发送呢?

#17


该优化的地方实在太多了
首先就是得把这些变量使用全局的.



还有

书写格式真的很乱
缩进没有注意
看得很乱.

#18


我来帮你UP一下,

#19


谢谢你们,那我就优化优化吧!

#1




这跟WINSOCK没关系的

你的代码有问题

#2


怎么输要5个WINSOCK?

是不是太多了些?

#3


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

#4


用5个winsock是因为必须要的,一个地方来的数据用一个,5个地方,这样不行吗?

另外,我的代码怎么会有问题呢,在点击按钮退出时,关闭winsock连接,unload窗体,有什么不对吗?
请多多指教!

#5


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

#6


对了.

数据接收量有多大啊?

看看是不是机器配置的原因

#7


数据接收量每次很小,我想是不是问题还是出在WINSOCK身上,

不过有时候运行一段时间WINDOWS会提示虚拟内存不够.但有时候没有啊,

WINSOCK接收数据是放在什么地方,我能用WINSOCK控件组吗


研究不透

#8


啊?

接收量小还会这样?

那你的代码绝对有问题了!


我自己做的文件互传工具.
每秒接收45K/S还很正常啊!


能把你的WINSOCK数据接收事件中写的代码贴出来吗?

如果优化了化码后区区5个WINSOCK是没什么关系的.

#9


估计你的数据接收处理有问题!

#10


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


问题出在这里吗

#11


嗯~

可能会在

建议自定义一个数据格式.

全部使用BYTE数组

然后在数组的第一个字节或最后一个字节处设置一下标记

那么你的机器接到这个数据后只要判断第一个字节是什么就能知道这条消息应该怎么处理了.

#12


强烈建议传递的数据全部采用BYTE数组方式传输!


代码多写两行没事

不过怎么说呢

你要有能把任何数组转成BYTE数组存放才行.

嘿嘿

我的程序以前就这样的.

不论是应用程序的事件信息还是对方的字串聊天信息以及还有文件数据等
全部用一个WINSOCK发送而不会混淆.

#13


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

#14


强烈建议贴出代码,一家人给你解决问题,你让大家发挥想象力猜吗?

#15


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



对不起,只好让你们晕了

#16


首先建议:

干嘛每次一收到都定义这么多变量啊?

会死人的!
为什么不做全局变量?!!
定义一个变量比访问一个变量来的慢多了!占用资源也多!

后面的就不用看了

效率极为低下!
为什么不转成BYTE数组发送呢?

#17


该优化的地方实在太多了
首先就是得把这些变量使用全局的.



还有

书写格式真的很乱
缩进没有注意
看得很乱.

#18


我来帮你UP一下,

#19


谢谢你们,那我就优化优化吧!

#20