在使用winsock数组发送消息时,必须使用一个Doevents才能把每一个winsock的信息发送出去,但是处理的时间就会很慢。如果去掉Doevents,就不能保证每一个winsock都能发送出去信息,有没有一种办法可以取代Doevents,又不交出控制权,而且不影响处理的时间?Dim a As Integer
For a = 0 To 100
Winsock1(a).SendData "info"
DoEvents
Next a

解决方案 »

  1.   

    Public Done As Boolean
    Const TimeOut As Long = 1000 '设置一个超时界限
    Public Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
    '以上声明在通用段Dim a As Integer
    tt as longFor a = 0 To 100
        Done = False
        Winsock1(a).SendData "info"
        tt = GetTickCount() + TimeOut
        Do Until Done
            '设置超时防止死循环
            If GetTickCount() > tt Then Exit Do
        Loop
    Next aPrivate Sub Winsock1_SendComplete()
       Done = True
    End Sub
      

  2.   

    to  of123()      谢谢!阁下的意思是,让每个winsock发送完信息后,都延迟1秒,再让下一个winsock发送信息?这样做如果处理一个1000次的循环会很慢的。我使用的是winsock数组:下面这段程序如何判断,winsock数组中的某一个winsock已经发送完毕呢?Private Sub Winsock1_SendComplete(Index As Integer)
       Done = True
    End Sub
      

  3.   

    DoEvents没什么问题啊,一直在用,没觉得慢
      

  4.   

    要是有叫 网卡清空发送网卡缓冲区的信息的方法,不用devents也行。可是我没听过有该方法,只好用doevents替代
      

  5.   

    因为devents前会实现我上面说的功能
      

  6.   

    to            zyg0(影子(转了1圈,我又回来了) 看了您的回复,但是doevents会放弃控制权,服务端如果有100个用户同时请求,那么有doevents的存在,就会产生混乱的。我目前遇到的就是这个问题?
      

  7.   

    虽然放弃了控制权,但是它是响应事件的,注意doevents只有在senddate之后用,其他的低放,没有必要用
      

  8.   

    to  zyg0(影子(转了1圈,我又回来了) 一旦放弃控制权,如果有100个用户同时请求服务端程序,winsock数组的索引可能会乱的。所以有没有一种办法可以实现doevents的功能,又不放弃控制权呢?
      

  9.   

    混乱是不会出现的,出现了混乱的话肯定不是doevents 的原因,而是其他代码的原因,我不知道有什么替代方法,只是一直这么写
      

  10.   

    Private m_strBuff() As String '发送数据的缓冲区
    Private m_CurBuffIndex As Integer '当前发送第几个数据Private Sub Command1_Click()
        '假设所有要发送的数据都存在m_strBuff数组里面了
        m_CurBuffIndex = 0 '先发送第一个
        Winsock1.SendData m_strBuff(m_CurBuffIndex)
    End SubPrivate Sub Winsock1_SendComplete()
        '发送完毕 接着发
        m_CurBuffIndex = m_CurBuffIndex + 1
        If m_CurBuffIndex <= UBound(m_strBuff) Then
            Winsock1.SendData m_strBuff(m_CurBuffIndex)
        Else
            'm_strBuff数组的数据全部发送完毕
            '初始化m_CurBuffIndex m_strBuff
            m_CurBuffIndex = 0
            ReDim m_strBuff(0)
        End If
    End Sub
      

  11.   

    '修正一下
    Private m_strBuff() As String '发送数据的缓冲区
    Private m_CurBuffIndex As Integer '当前发送第几个数据Private Sub Command1_Click()
        '假设所有要发送的数据都存在m_strBuff数组里面了
        m_CurBuffIndex = 0 '先发送第一个
        Winsock1.SendData m_strBuff(m_CurBuffIndex)
    End SubPrivate Sub Winsock1_SendComplete()
        '发送完毕 接着发
        m_CurBuffIndex = m_CurBuffIndex + 1
        If m_CurBuffIndex <= UBound(m_strBuff) And m_CurBuffIndex >=0 Then
            Winsock1.SendData m_strBuff(m_CurBuffIndex)
        Else
            'm_strBuff数组的数据全部发送完毕
            '初始化m_CurBuffIndex m_strBuff
            m_CurBuffIndex = -1 '-1表示缓冲区里没有要发送的数据
            ReDim m_strBuff(0)
        End If
    End Sub
      

  12.   

    使用SendComplete事件来控制<可能速度会很慢>
    Private Sub Winsock1_SendComplete(index as long)
       winsock1(index+1).send "info"
    end sub
      

  13.   

    //服务端如果有100个用户同时请求,那么有doevents的存在,就会产生混乱的。我目前遇到的就是这个问题?
    是连接混乱还是数据交换混乱?
    如果是数据交换混乱,是因为处理数据的时间过长,我是这么解决:
    数据到达时,创建一个对象集合保存接收的数据,然后再处理集合的数据。