以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  多人同时使用时系统卡死  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=196541)

--  作者:drcqh
--  发布时间:2025/5/11 22:19:00
--  多人同时使用时系统卡死
请教老师,项目使用OpenQQ实现数据的同步,但在多人使用时如有一人在操作,其它电脑就卡死了,这是什么原因?如何解决
--  作者:有点蓝
--  发布时间:2025/5/11 22:35:00
--  
使用的什么数据库?
--  作者:drcqh
--  发布时间:2025/5/12 10:59:00
--  
sql server


--  作者:有点蓝
--  发布时间:2025/5/12 11:46:00
--  
Foxtable的事件都是按顺序处理的,同一个事件多人触发,会等待前面的处理完毕。如果过于频繁的更新数据并更新同步,是会有卡这种情况的。

方便把服务端openqq的事件发上来看看能不能优化一下。

--  作者:drcqh
--  发布时间:2025/5/12 12:49:00
--  

一、服务端:

1、ReceivedMessage事件:

    If e.Message = "+user+" Then  \'如果收到"+user+"信息时,重新加载用户表

        DataTables("Users").Load()

    End If

    Dim msg As String = e.Message

    If msg.StartsWith(":g") AndAlso msg.EndsWith("g:") Then

        msg = msg.SubString(2, msg.Length - 4)

        If flbhs.ContainsKey(msg) Then \'如果存在这个月的编号.flbhs为全局变量

            flbhs(msg) = flbhs(msg) + 1 \'将该月最大编号加1

        Else

            flbhs.Add(msg,1) \'如果这个月的首次编号,则编号等于1

        End If

   End if

2、UserLogging事件:

     If e.User IsNot Nothing Then

          e.Success=True

          For Each u As UserInfo In users

             If u.Name<>e.User.Name Then

                 If u.Group>"" Then

                    e.Buddies.Add(u.Group & "." & u.Name)

                 End If

             End If

           Next

   Eles If

        e.ReturnValue = flbhs(msg)

   End If


二、客户端:

1、ReceivedMessage事件:

Dim msg As String = e.Message

\'MessageBox.Show("我是客户端接收到的信息:" & msg)

If msg.StartsWith("U#") Then \'表示修改了某行

    Dim pts() As String = msg.Split("#")

    If pts.Length = 3 Then

        Dim dr As DataRow = DataTables(pts(1)).Find("[_Identify] = " & pts(2))

        If dr IsNot Nothing  Then

            dr.Load() \'重新加载此行

        End If 

    End If


ElseIf msg.StartsWith("A#") Then \'表示增加了行

    Dim pts() As String = msg.Split("#")

    If pts.Length = 3 Then

        DataTables(pts(1)).AppendLoad("[_Identify] = " & pts(2)) 

    End If

ElseIf msg.StartsWith("D#") Then \'表示删除了行

    Dim pts() As String = msg.Split("#")

    If pts.Length = 3 Then

        DataTables(pts(1)).RemoveFor("[_Identify] = " & pts(2)) 

    End If

ElseIf msg.StartsWith("M#") Then \'M表示移除行

    Dim pts() As String = msg.Split("#")

    If pts.Length = 3 Then

        DataTables(pts(1)).RemoveFor("[_Identify] = " & pts(2)) \'移除行

    End If

    

End If


If msg.StartsWith("+@") Then                      \'如: +@|主键|处方号|医生姓名

    Dim pts() As String =msg.Split("|")

    dsfs.add(pts(1) & "|" & pts(2) & "|" & pts(3))  \'dsfs为全局变量待收费处方

    Forms("信息提示窗口").Open

End If




--  作者:有点蓝
--  发布时间:2025/5/12 13:35:00
--  
如果是某个客户端大批量的更新、新增或者删除行,建议就不要使用这个功能了,建议直接发个消息给客户端提醒手工更新吧!
--  作者:drcqh
--  发布时间:2025/5/12 22:14:00
--  
好的,谢谢!