如题,服务端winsock使用控件数组,客户端有多个。当其中一个客户端消息到达服务器端的时候,dataarrival事件触发,执行代码。假设要执行的代码比较多,在执行的时候又有另一个客户端发消息过来,dataarrival又触发,那这个时候会不会影响上一个dataarrival正在运算中的变量?如果会,应该怎样这个问题呢?麻烦给个详细思路。还有,当某个winsock控件正在给对方发消息的时候,对方有消息发过来了,会产生什么冲突吗?

解决方案 »

  1.   

    在一个过程中,如果没有DoEvents语句,是不会响应其他事件的。。
      

  2.   

    如果客房端有多个,那么服务器端要同时连接多个客房端就也必须有多个winsock控件与其对应,它们各收各信息,各处理各的信息就不会互相影响。比如:定义一个数组,数组的每个元素对应装入每个winsock事件的返回值,再处理这个数组就行了。
      

  3.   

    有一些变量不能独立计算,是整体计算的。所以“定义一个数组,数组的每个元素对应装入每个winsock事件的返回值”这个方法不行。就是一些公有变量,需要共同使用的,比如N个客户端,我要求他们的相加的值,然后反馈给所有的客户端。
      

  4.   

    现在就是服务器用的就是winsock数组,他们收到信息后,都会将几个变量进行操作。例如:
    dim a as integer
    dim b as integersub wsk_dataarrival
        a=a+1
        b=b+1
        '这里调用群发给客户端信息的代码
    end sub
    假设那个a=a+1和b=b+1的计算很多,需要1秒钟才能完成计算,在计算了半秒钟也就是计算了一半的时候,又收到了信息,然后也会计算 a=a+1。
    假设,2个客户端都只发一次消息,而发信息的时间间隔为0.1秒,服务器计算完需要1秒。那么服务器就会在第1个客户端消息到达后正在计算的时候,又收到了第2个客户端的消息。然后又在计算变量。
    理论上讲,当第一个客户端的消息到达服务器后,服务器反馈给客户端的消息是a=1,b=1。第2个客户端消息到达后是a=2,b=2。我想问的是,第一个客户端消息到达服务器,服务器反馈给客户端的时候会不会成了 a=2,b=1。也就是受第2个客户端消息到达时运行了a=a+1的计算的影响。就是这个意思。不知道说明白没有。
      

  5.   

    应该是不会出现这种情况的,如果在wsk_dataarrival事件里没有Doevents的话那么在执行完第一个客户端消息的所有代码之前是不会去响应其他消息的
      

  6.   

    不会,
    sub wsk_dataarrival 
        a=a+1 
        b=b+1 
        '这里调用群发给客户端信息的代码 ,以上要计算完才会到这里
    end sub 
      

  7.   


    其实我就是想要一个这样的答案或者相反的答案。
    我的期望是,当收到第1个客户端的消息后开始处理数据,在处理数据的过程中,就算又有新消息到达,也不会立即触发dataarrival事件。这样就不会影响到服务器第1次发送反馈消息的数值了。
    即:
    还是上面的举例。第1个客户端消息到达后,开始计算,计算到一半的时候,又一个消息到达,在还没有处理完第1个消息的时候不响应第二个消息。
    是不是?