我的程序经常几乎在同一时间触发多个事件,而这些事件调用的过程要访问同一个数组,如何避免两段过程同时修改数组导致错误覆盖掉之前的数据?我本来设想做一个标记,当一段过程访问数组前查看标记,如果标记表示没有别的过程访问数组,就先改写标记,再访问数组。但是也会出现这个过程查看标记没问题后,正要改写标记之前却被另一个过程来检查标记,导致两个过程都以为自己可以访问数组,还是会导致访问冲突。

解决方案 »

  1.   

    不知道啊,我用winsock控件,当有多个连接遇到dataArivel(可能拼错)事件时?程序会对这些事件采用多线程来处理吗?
      

  2.   

    winsock包含多线程------我猜的。一般情况:
    1、tcp模式下,不需要自己分包发送,winsock会自动根据当前网络情况分包发送,在接收端只需要将接收到的字节数组按顺序拼接就可以;
    2、如果是分块并使用多个winsock来发送的话,就需要自己处理各个块的顺序问题。多对winsock之间的发送顺序和接收顺序可能有差别。
      

  3.   

    @bakw 那么收发的数据要不要自己做个校验,防止tcp通信个别bit被反置了,还是说tcp通信本身就能防止这种错误?
      

  4.   

    用多个winsock接收多个连接请求,就不能用一个数组啊。
    你把数组定义到一个类中,然后创建一个winsock的同时也创建一个类实例,不就每个winsock就有一个自己的数组了。
      

  5.   

    一般TCP通讯自带了校验的,不需要自己外加,但是数据包长度是在1.5K以下的,发送和接收顺序可能会不一致,所以如果是多包数据,需要确定包的序号
      

  6.   

    仅供参考:Private Sub SendCICMsg(tn As Integer, s As String) 'lineA...
    Dim after As Double
        On Error Resume Next
        after = Now + 15# / 24# / 3600#
        Do
            DoEvents
            If CICsending = -1 Then
                CICsending = tn
                If CICsending = tn Then
                    CICstr = s
                    TimerCICsend.Enabled = True
                    Exit Do
                End If
            End If
            If Now > after Then
                LogErrMsg "SendCICMsg " + CStr(tn) + "," + s + " 15s overtime!"
                CICsending = -1
                Exit Do
            End If
        Loop
    End Sub
      

  7.   

    @bakw 我举个例子,用winsock控件向web服务器发起一个下载1M大的文件的请求,那服务器不一定会帮你把每个包都标好顺序的吧?难道winsock控件不保证每个数据包的顺序?
      

  8.   

    具体不是很清楚,记得用以前winsock下载web数据接收效果很糟糕,后来我改用winhttp来下载,省心得多。
      

  9.   

    和协议(Protocol属性)有关,TCP是有序的,UDP是无序的。